导航

    全志在线开发者论坛

    • 注册
    • 登录
    • 搜索
    • 版块
    • 话题
    • 在线文档
    • 社区主页
    1. 主页
    2. awwwwa
    3. 帖子
    A
    • 资料
    • 关注 0
    • 粉丝 18
    • 我的积分 14031
    • 主题 11
    • 帖子 546
    • 最佳 147
    • 群组 1

    awwwwa 发布的帖子

    • 回复: 如何将Libuvc编译到tina系统中

      参照opencv的编写使用cmake的makefile

      include $(TOPDIR)/rules.mk
      
      PKG_NAME:=opencv
      PKG_VERSION:=4.1.1
      PKG_RELEASE:=1
      
      PKG_SOURCE_PROTO:=git
      PKG_SOURCE_URL:=https://github.com/opencv/opencv
      PKG_SOURCE_VERSION:=$(PKG_VERSION)
      PKG_MIRROR_HASH:=c8587820421d2f22acdafe4712d068ae490897dc445bdb4aa128ecaa8e65d3a1
      
      PKG_MAINTAINER:=
      PKG_LICENSE:=BSD-3-Clause
      PKG_LICENSE_FILES:=LICENSE
      
      CMAKE_INSTALL:=1
      CMAKE_BINARY_SUBDIR:=build
      PKG_BUILD_PARALLEL:=1
      PKG_USE_MIPS16:=0
      
      include $(INCLUDE_DIR)/package.mk
      include $(INCLUDE_DIR)/cmake.mk
      
      define Package/opencv/Default/description
       OpenCV (Open Source Computer Vision Library) is an open source computer
       vision and machine learning software library. OpenCV was built to provide
       a common infrastructure for computer vision applications and to accelerate
       the use of machine perception in the commercial products. Being a
       BSD-licensed product, OpenCV makes it easy for businesses to utilize
       and modify the code.
      endef
      
      define Package/opencv
        SECTION:=libs
        CATEGORY:=Libraries
        TITLE:=OpenCV
        URL:=https://opencv.org/
        DEPENDS:=+libpthread +librt +libatomic +libstdcpp +zlib +libjpeg +python3 +python3-numpy
      endef
      
      CMAKE_OPTIONS += \
      	-DBUILD_opencv_gpu:BOOL=OFF \
      	-DWITH_1394:BOOL=OFF -DBUILD_opencv_stitching:BOOL=OFF \
      	-DBUILD_opencv_superres:BOOL=OFF -DBUILD_opencv_ts:BOOL=OFF \
      	-DBUILD_opencv_highgui:BOOL=ON \
      	-DBUILD_opencv_videostab:BOOL=OFF \
      	-DWITH_FFMPEG:BOOL=OFF \
      	-DWITH_GSTREAMER:BOOL=OFF \
      	-DWITH_LIBV4L:BOOL=ON \
      	-DWITH_PNG:BOOL=OFF \
      	-DWITH_GTK:BOOL=OFF \
      	-DWITH_TIFF:BOOL=OFF \
      	-DCMAKE_VERBOSE:BOOL=OFF \
      	-DENABLE_PRECOMPILED_HEADERS=OFF \
      	-DPYTHON3_INCLUDE_PATH=$(STAGING_DIR)/usr/include/python3.9 \
      	-DPYTHON3_LIBRARIES=$(STAGING_DIR)/usr/lib/libpython3.9.so \
      	-DPYTHON3_NUMPY_INCLUDE_DIRS=$(TARGET_ROOTFS_DIR)/pypi/numpy-1.20.1/ipkg-install/usr/lib/python3.9/site-packages/numpy/core/include \
      	-DBUILD_OPENCV_PYTHON3:BOOL=ON
      
      TARGET_LDFLAGS += -latomic
      
      define Package/opencv/install
      	$(INSTALL_DIR) $(1)/usr/lib
      	$(CP) $(PKG_INSTALL_DIR)/usr/lib/* $(1)/usr/lib/
      endef
      
      $(eval $(call BuildPackage,opencv))
      
      发布在 V Series
      A
      awwwwa
    • 回复: V851/V853视频输出

      @nimadanbbs 可以,绑定VI2VO通路即可

      发布在 V Series
      A
      awwwwa
    • 回复: tina SDK编译的buildroot文件系统,如何更改只读属性?

      tina SDK可以编译buildroot吗?

      这里需要修改配置fstab和勾选对应格式化包,不过我感觉你这应该不是tina,没有包括扩展分区

      发布在 MR Series
      A
      awwwwa
    • 回复: 100s tina 32bit frambuffer怎么变成16bit,tina 的disp框架有点大,不知道在哪个地方修改

      设备树的disp节点

      fbx format (4:RGB655 5:RGB565 6:RGB556 7:ARGB1555 8:RGBA5551 9:RGB888 10:ARGB8888 12:ARGB4444)

      发布在 Linux
      A
      awwwwa
    • 回复: 【水经验混下载权限专用贴】如何升级LV2拉取SDK

      @yinjc 85104215-d1c8-400e-a365-735a28c41fbb-image.png

      发布在 灌水区
      A
      awwwwa
    • 回复: 【水经验混下载权限专用贴】如何升级LV2拉取SDK

      @luminous 90783e9f-bbc3-435c-ad83-525713f6c1dc-image.png

      发布在 灌水区
      A
      awwwwa
    • 回复: V853s如何实现UI图层和视频图层同时用

      @hzhy1234

      70d76a7a-c952-4af8-b3fb-ffc3ea449ab2-image.png

      #include <unistd.h>
      #include <stdlib.h>
      #include <stdio.h>
      #include <string.h>
      #include <pthread.h>
      #include <ctype.h>
      #include <errno.h>
      #include <sys/select.h>
      #include <sys/types.h>
      #include <dirent.h>
      #include <fcntl.h>
      #include <signal.h>
      
      
      #include <tplayer.h>
      //#include <power_manager_client.h>
      
      #define TOTAL_VIDEO_AUDIO_NUM 100
      #define MAX_FILE_NAME_LEN 256
      #define FILE_TYPE_NUM 29
      #define FILE_TYPE_LEN 10
      #define VIDEO_TYPE_NUM 11
      #define VIDEO_TYPE_LEN 10
      #define USE_REPEAT_RESET_MODE 1
      #define HOLD_LAST_PICTURE 1
      #define LOOP_PLAY_FLAG 1
      
      typedef struct DemoPlayerContext
      {
          TPlayer*          mTPlayer;
          int               mSeekable;
          int               mError;
          int               mVideoFrameNum;
          bool              mPreparedFlag;
          bool              mLoopFlag;
          bool              mSetLoop;
          bool              mComplete;
          char              mUrl[512];
          MediaInfo*        mMediaInfo;
          char              mVideoAudioList[TOTAL_VIDEO_AUDIO_NUM][MAX_FILE_NAME_LEN];
          int               mCurPlayIndex;
          int               mRealFileNum;
          sem_t             mPreparedSem;
      }DemoPlayerContext;
      
      //* define commands for user control.
      typedef struct Command
      {
          const char* strCommand;
          int         nCommandId;
          const char* strHelpMsg;
      }Command;
      
      #define COMMAND_HELP            0x1     //* show help message.
      #define COMMAND_QUIT            0x2     //* quit this program.
      
      #define COMMAND_SET_SOURCE      0x101   //* set url of media file.
      #define COMMAND_PREPARE         0x102   //* prepare the media file.
      #define COMMAND_PLAY            0x103   //* start playback.
      #define COMMAND_PAUSE           0x104   //* pause the playback.
      #define COMMAND_STOP            0x105   //* stop the playback.
      #define COMMAND_SEEKTO          0x106   //* seek to posion, in unit of second.
      #define COMMAND_RESET           0x107   //* reset the player
      #define COMMAND_SHOW_MEDIAINFO  0x108   //* show media information.
      #define COMMAND_SHOW_DURATION   0x109   //* show media duration, in unit of second.
      #define COMMAND_SHOW_POSITION   0x110   //* show current play position, in unit of second.
      #define COMMAND_SWITCH_AUDIO    0x111   //* switch autio track.
      #define COMMAND_PLAY_URL        0x112   //set url and prepare and play
      #define COMMAND_SET_VOLUME      0x113   //set the software volume
      #define COMMAND_GET_VOLUME      0x114   //get the software volume
      #define COMMAND_SET_LOOP        0x115   //set loop play flag,1 means loop play,0 means not loop play
      #define COMMAND_SET_SCALEDOWN   0x116   //set video scale down ratio,valid value is:2,4,8 .  2 means 1/2 scaledown,4 means 1/4 scaledown,8 means 1/8 scaledown
      #define COMMAND_FAST_FORWARD    0x117   //fast forward,valid value is:2,4,8,16, 2 means 2 times fast forward,4 means 4 times fast forward,8 means 8 times fast forward,16 means 16 times fast forward
      #define COMMAND_FAST_BACKWARD   0x118   //fast backward,valid value is:2,4,8,16,2 means 2 times fast backward,4 means 4 times fast backward,8 means 8 times fast backward,16 means 16 times fast backward
      #define COMMAND_SET_SRC_RECT    0x119  //set display source crop rect
      #define COMMAND_SET_OUTPUT_RECT 0x120  //set display output display rect
      #define COMMAND_GET_DISP_FRAMERATE   0x121   //* show the real display framerate
      
      
      #define CEDARX_UNUSE(param) (void)param
      
      static const Command commands[] =
      {
          {"help",            COMMAND_HELP,               "show this help message."},
          {"quit",            COMMAND_QUIT,               "quit this program."},
          {"set url",         COMMAND_SET_SOURCE,         "set url of the media, for example, set url: ~/testfile.mkv."},
          {"prepare",         COMMAND_PREPARE,            "prepare the media."},
          {"play",            COMMAND_PLAY,               "start playback."},
          {"pause",           COMMAND_PAUSE,              "pause the playback."},
          {"stop",            COMMAND_STOP,               "stop the playback."},
          {"seek to",         COMMAND_SEEKTO,             "seek to specific position to play, position is in unit of second, for example, seek to: 100."},
          {"reset",           COMMAND_RESET,              "reset the player."},
          {"show media info", COMMAND_SHOW_MEDIAINFO,     "show media information of the media file."},
          {"show duration",   COMMAND_SHOW_DURATION,      "show duration of the media file."},
          {"show position",   COMMAND_SHOW_POSITION,      "show current play position, position is in unit of second."},
          {"switch audio",    COMMAND_SWITCH_AUDIO,       "switch audio to a specific track, for example, switch audio: 2, track is start counting from 0."},
          {"play url",        COMMAND_PLAY_URL,           "set url and prepare and play url,for example:play url:/mnt/UDISK/test.mp3"},
          {"set volume",      COMMAND_SET_VOLUME,         "set the software volume,the range is 0-40,for example:set volume:30"},
          {"get volume",      COMMAND_GET_VOLUME,         "get the software volume"},
          {"set loop",        COMMAND_SET_LOOP,           "set the loop play flag,1 means loop play,0 means not loop play"},
          {"set scaledown",   COMMAND_SET_SCALEDOWN,      "set video scale down ratio,valid value is:2,4,8 .  2 means 1/2 scaledown,4 means 1/4 scaledown,8 means 1/8 scaledown"},
          {"fast forward",    COMMAND_FAST_FORWARD,       "fast forward,valid value is:2,4,8,16, 2 means 2 times fast forward,4 means 4 times fast forward,8 means 8 times fast forward,16 means 16 times fast forward"},
          {"fast backward",   COMMAND_FAST_BACKWARD,      "fast backward,valid value is:2,4,8,16,2 means 2 times fast backward,4 means 4 times fast backward,8 means 8 times fast backward,16 means 16 times fast backward"},
          {"set src_rect",	COMMAND_SET_SRC_RECT,	    "set display source crop rect"},
          {"set dst_rect",	COMMAND_SET_OUTPUT_RECT,    "set display output rect"},
          {"get display framerate",   COMMAND_GET_DISP_FRAMERATE,      "show the real display framerate."},
          {NULL, 0, NULL}
      };
      
      DemoPlayerContext demoPlayer;
      DemoPlayerContext gDemoPlayers[5];
      int isDir = 0;
      int gScreenWidth = 0;
      int gScreenHeight = 0;
      int gPlayerNum = 0;
      
      /* Signal handler */
      static void terminate(int sig_no)
      {
          printf("Got signal %d, exiting ...\n", sig_no);
      
          if(demoPlayer.mTPlayer != NULL)
          {
              TPlayerDestroy(demoPlayer.mTPlayer);
              demoPlayer.mTPlayer = NULL;
              printf("TPlayerDestroy() successfully\n");
          }
      
          sem_destroy(&demoPlayer.mPreparedSem);
      
          int i=0;
          for(i = gPlayerNum-1;i >= 0;i--){
              if(gDemoPlayers[i].mTPlayer != NULL)
              {
                  TPlayerDestroy(gDemoPlayers[i].mTPlayer);
                  gDemoPlayers[i].mTPlayer = NULL;
                  printf("TPlayerDestroy(%d) successfully\n",i);
              }
          }
          printf("destroy tplayer \n");
          printf("tplaydemo exit\n");
          exit(1);
      }
      
      static void install_sig_handler(void)
      {
          signal(SIGBUS, terminate);
          signal(SIGFPE, terminate);
          signal(SIGHUP, terminate);
          signal(SIGILL, terminate);
          signal(SIGINT, terminate);
          signal(SIGIOT, terminate);
          signal(SIGPIPE, terminate);
          signal(SIGQUIT, terminate);
          signal(SIGSEGV, terminate);
          signal(SIGSYS, terminate);
          signal(SIGTERM, terminate);
          signal(SIGTRAP, terminate);
          signal(SIGUSR1, terminate);
          signal(SIGUSR2, terminate);
      }
      
      static void showHelp(void)
      {
          int     i;
          printf("\n");
          printf("******************************************************************************************\n");
          printf("* This is a simple media player, when it is started, you can input commands to tell\n");
          printf("* what you want it to do.\n");
          printf("* Usage: \n");
          printf("*   # ./tplayerdemo\n");
          printf("*   # set url:/mnt/UDISK/test.mp3\n");
          printf("*   # prepare\n");
          printf("*   # show media info\n");
          printf("*   # play\n");
          printf("*   # pause\n");
          printf("*   # stop\n");
          printf("*   # reset\n");
          printf("*   # seek to:100\n");
          printf("*   # play url:/mnt/UDISK/test.mp3\n");
          printf("*   # set volume:30\n");
          printf("*   # get volume\n");
          printf("*   # set loop:1 \n");
          printf("*   # set scaledown:2 \n");
          printf("*   # fast forward:2 \n");
          printf("*   # fast backward:2 \n");
          printf("*   # switch audio:1 \n");
          printf("*   #get display framerate \n");
          printf("*\n");
          printf("* Command and it's param is seperated by a colon, param is optional, as below:\n");
          printf("* Command[: Param]\n");
          printf("*   #notice:we can play a list use the following command,for example the video or audio file puts in /mnt/UDISK/ directory \n");
          printf("*   #tplayerdemo /mnt/UDISK/ \n");
          printf("*   #notice:we can play one file use the following command,for example the video or audio file puts in /mnt/UDISK/ directory \n");
          printf("*   #tplayerdemo /mnt/UDISK/test.mp4 \n");
          printf("*   #notice:we can play two file use the following command,for example the video or audio file puts in /mnt/UDISK/ directory \n");
          printf("*   #tplayerdemo /mnt/UDISK/test1.mp4 /mnt/UDISK/test2.mp4\n");
          printf("*\n");
          printf("* here are the commands supported:\n");
      
          for(i=0; ; i++)
          {
              if(commands[i].strCommand == NULL)
                  break;
              printf("*    %s:\n", commands[i].strCommand);
              printf("*\t\t%s\n",  commands[i].strHelpMsg);
          }
          printf("*\n");
          printf("******************************************************************************************\n");
      }
      
      static int readCommand(char* strCommandLine, int nMaxLineSize)
      {
          int            nMaxFds;
          fd_set         readFdSet;
          int            result;
          char*          p;
          unsigned int   nReadBytes;
          struct timeval tv;
          tv.tv_sec = 1;
          tv.tv_usec = 0;
          fflush(stdout);
      
          nMaxFds    = 0;
          FD_ZERO(&readFdSet);
          FD_SET(STDIN_FILENO, &readFdSet);
      
          result = select(nMaxFds+1, &readFdSet, NULL, NULL, &tv);
          if(result > 0)
          {
              printf("\ntplayerdemo# ");
              if(FD_ISSET(STDIN_FILENO, &readFdSet))
              {
                  nReadBytes = read(STDIN_FILENO, &strCommandLine[0], nMaxLineSize);
                  if(nReadBytes > 0)
                  {
                      p = strCommandLine;
                      while(*p != 0)
                      {
                          if(*p == 0xa)
                          {
                              *p = 0;
                              break;
                          }
                          p++;
                      }
                  }
      
                  return 0;
              }
          }
      
          return -1;
      }
      
      static void formatString(char* strIn)
      {
          char* ptrIn;
          char* ptrOut;
          int   len;
          int   i;
      
          if(strIn == NULL || (len=strlen(strIn)) == 0)
              return;
      
          ptrIn  = strIn;
          ptrOut = strIn;
          i      = 0;
          while(*ptrIn != '\0')
          {
              //* skip the beginning space or multiple space between words.
              if(*ptrIn != ' ' || (i!=0 && *(ptrOut-1)!=' '))
              {
                  *ptrOut++ = *ptrIn++;
                  i++;
              }
              else
                  ptrIn++;
          }
      
          //* skip the space at the tail.
          if(i==0 || *(ptrOut-1) != ' ')
              *ptrOut = '\0';
          else
              *(ptrOut-1) = '\0';
      
          return;
      }
      
      
      //* return command id,
      static int parseCommandLine(char* strCommandLine, unsigned long* pParam)
      {
          char* strCommand;
          char* strParam;
          int   i;
          int   nCommandId;
          char  colon = ':';
      
          if(strCommandLine == NULL || strlen(strCommandLine) == 0)
          {
              return -1;
          }
      
          strCommand = strCommandLine;
          strParam   = strchr(strCommandLine, colon);
          if(strParam != NULL)
          {
              *strParam = '\0';
              strParam++;
          }
      
          formatString(strCommand);
          formatString(strParam);
      
          nCommandId = -1;
          for(i=0; commands[i].strCommand != NULL; i++)
          {
              if(strcmp(commands[i].strCommand, strCommand) == 0)
              {
                  nCommandId = commands[i].nCommandId;
                  break;
              }
          }
      
          if(commands[i].strCommand == NULL)
              return -1;
      
          switch(nCommandId)
          {
              case COMMAND_SET_SOURCE:
                  if(strParam != NULL && strlen(strParam) > 0)
                      *pParam = (uintptr_t)strParam;        //* pointer to the url.
                  else
                  {
                      printf("no url specified.\n");
                      nCommandId = -1;
                  }
                  break;
      
              case COMMAND_SEEKTO:
                  if(strParam != NULL)
                  {
                      *pParam = (int)strtol(strParam, (char**)NULL, 10);  //* seek time in unit of second.
                      if(errno == EINVAL || errno == ERANGE)
                      {
                          printf("seek time is not valid.\n");
                          nCommandId = -1;
                      }
                  }
                  else
                  {
                      printf("no seek time is specified.\n");
                      nCommandId = -1;
                  }
                  break;
      
              case COMMAND_SWITCH_AUDIO:
                  if(strParam != NULL)
                  {
                      *pParam = (int)strtol(strParam, (char**)NULL, 10);  //* audio stream index start counting from 0.
                      if(errno == EINVAL || errno == ERANGE)
                      {
                          printf("audio stream index is not valid.\n");
                          nCommandId = -1;
                      }
                  }
                  else
                  {
                      printf("no audio stream index is specified.\n");
                      nCommandId = -1;
                  }
                  break;
      
              case COMMAND_PLAY_URL:
                  if(strParam != NULL && strlen(strParam) > 0)
                      *pParam = (uintptr_t)strParam;        //* pointer to the url.
                  else
                  {
                      printf("no url to play.\n");
                      nCommandId = -1;
                  }
                  break;
      
              case COMMAND_SET_VOLUME:
                  if(strParam != NULL)
                  {
                      *pParam = (int)strtol(strParam, (char**)NULL, 10);  //* seek time in unit of second.
                      if(errno == EINVAL || errno == ERANGE)
                      {
                          printf("volume value is not valid.\n");
                          nCommandId = -1;
                      }
                  }
                  else
                  {
                      printf("the volume value is not specified.\n");
                      nCommandId = -1;
                  }
                  break;
      
              case COMMAND_SET_LOOP:
                  if(strParam != NULL)
                  {
                      *pParam = (int)strtol(strParam, (char**)NULL, 10);
                      if(errno == EINVAL || errno == ERANGE)
                      {
                          printf("loop value is not valid.\n");
                          nCommandId = -1;
                      }
                  }
                  else
                  {
                      printf("the loop value is not specified.\n");
                      nCommandId = -1;
                  }
                  break;
      
              case COMMAND_SET_SCALEDOWN:
                  if(strParam != NULL)
                  {
                      *pParam = (int)strtol(strParam, (char**)NULL, 10);
                      if(errno == EINVAL || errno == ERANGE)
                      {
                          printf("scaledown value is not valid.\n");
                          nCommandId = -1;
                      }
                  }
                  else
                  {
                      printf("the scaledown value is not specified.\n");
                      nCommandId = -1;
                  }
                  break;
      
              case COMMAND_FAST_FORWARD:
                  if(strParam != NULL)
                  {
                      *pParam = (int)strtol(strParam, (char**)NULL, 10);
                      if(errno == EINVAL || errno == ERANGE)
                      {
                          printf("play fast value is not valid.\n");
                          nCommandId = -1;
                      }
                  }
                  else
                  {
                      printf("play fast value is not specified.\n");
                      nCommandId = -1;
                  }
                  break;
      
              case COMMAND_FAST_BACKWARD:
                  if(strParam != NULL)
                  {
                      *pParam = (int)strtol(strParam, (char**)NULL, 10);
                      if(errno == EINVAL || errno == ERANGE)
                      {
                          printf("play slow value is not valid.\n");
                          nCommandId = -1;
                      }
                  }
                  else
                  {
                      printf("play slow value is not specified.\n");
                      nCommandId = -1;
                  }
                  break;
      
              default:
                  break;
          }
      
          return nCommandId;
      }
      
      static int semTimedWait(sem_t* sem, int64_t time_ms)
      {
          int err;
      
          if(time_ms == -1)
          {
              err = sem_wait(sem);
          }
          else
          {
              struct timespec ts;
              clock_gettime(CLOCK_REALTIME, &ts);
              ts.tv_nsec += time_ms % 1000 * 1000 * 1000;
              ts.tv_sec += time_ms / 1000 + ts.tv_nsec / (1000 * 1000 * 1000);
              ts.tv_nsec = ts.tv_nsec % (1000*1000*1000);
      
              err = sem_timedwait(sem, &ts);
          }
      
          return err;
      }
      
      
      //* a callback for tplayer.
      int CallbackForTPlayer(void* pUserData, int msg, int param0, void* param1)
      {
          DemoPlayerContext* pDemoPlayer = (DemoPlayerContext*)pUserData;
      
          CEDARX_UNUSE(param1);
          switch(msg)
          {
              case TPLAYER_NOTIFY_PREPARED:
              {
                  printf("TPLAYER_NOTIFY_PREPARED,has prepared.\n");
                  sem_post(&pDemoPlayer->mPreparedSem);
                  pDemoPlayer->mPreparedFlag = 1;
                  break;
              }
      
              case TPLAYER_NOTIFY_PLAYBACK_COMPLETE:
              {
                  printf("TPLAYER_NOTIFY_PLAYBACK_COMPLETE\n");
                  pDemoPlayer->mComplete = 1;
                  if(pDemoPlayer->mSetLoop == 1){
                      pDemoPlayer->mLoopFlag = 1;
                  }else{
                      pDemoPlayer->mLoopFlag = 0;
                  }
                  //PowerManagerReleaseWakeLock("tplayerdemo");
                  break;
              }
      
              case TPLAYER_NOTIFY_SEEK_COMPLETE:
              {
                  printf("TPLAYER_NOTIFY_SEEK_COMPLETE>>>>info: seek ok.\n");
                  break;
              }
      
              case TPLAYER_NOTIFY_MEDIA_ERROR:
              {
                  switch (param0)
                  {
                      case TPLAYER_MEDIA_ERROR_UNKNOWN:
                      {
                          printf("erro type:TPLAYER_MEDIA_ERROR_UNKNOWN\n");
                          break;
                      }
                      case TPLAYER_MEDIA_ERROR_UNSUPPORTED:
                      {
                          printf("erro type:TPLAYER_MEDIA_ERROR_UNSUPPORTED\n");
                          break;
                      }
                      case TPLAYER_MEDIA_ERROR_IO:
                      {
                          printf("erro type:TPLAYER_MEDIA_ERROR_IO\n");
                          break;
                      }
                  }
                  printf("TPLAYER_NOTIFY_MEDIA_ERROR\n");
                  pDemoPlayer->mError = 1;
                  if(pDemoPlayer->mPreparedFlag == 0){
                      printf("recive err when preparing\n");
                      sem_post(&pDemoPlayer->mPreparedSem);
                  }
                  if(pDemoPlayer->mSetLoop == 1){
                      pDemoPlayer->mLoopFlag = 1;
                  }else{
                      pDemoPlayer->mLoopFlag = 0;
                  }
                  printf("error: open media source fail.\n");
                  break;
              }
      
              case TPLAYER_NOTIFY_NOT_SEEKABLE:
              {
                  pDemoPlayer->mSeekable = 0;
                  printf("info: media source is unseekable.\n");
                  break;
              }
      
              case TPLAYER_NOTIFY_BUFFER_START:
              {
                  printf("have no enough data to play\n");
                  break;
              }
      
              case TPLAYER_NOTIFY_BUFFER_END:
              {
                  printf("have enough data to play again\n");
                  break;
              }
      
              case TPLAYER_NOTIFY_VIDEO_FRAME:
              {
                  //printf("get the decoded video frame\n");
                  break;
              }
      
              case TPLAYER_NOTIFY_AUDIO_FRAME:
              {
                  //printf("get the decoded audio frame\n");
                  break;
              }
      
              case TPLAYER_NOTIFY_SUBTITLE_FRAME:
              {
                  //printf("get the decoded subtitle frame\n");
                  break;
              }
              case TPLAYER_NOTYFY_DECODED_VIDEO_SIZE:
              {
                  int w, h;
                  w   = ((int*)param1)[0];   //real decoded video width
                  h  = ((int*)param1)[1];   //real decoded video height
                  printf("*****tplayerdemo:video decoded width = %d,height = %d",w,h);
                  //int divider = 1;
                  //if(w>400){
                  //    divider = w/400+1;
                  //}
                  //w = w/divider;
                  //h = h/divider;
                  printf("real set to display rect:w = %d,h = %d\n",w,h);
                  //TPlayerSetSrcRect(pDemoPlayer->mTPlayer, 0, 0, w, h);
              }
      
              default:
              {
                  printf("warning: unknown callback from Tinaplayer.\n");
                  break;
              }
          }
          return 0;
      }
      
      static int playVideo(DemoPlayerContext* playerContext, char* url,int x,int y,int width,int height)
      {
      	printf("before TPlayerSetDataSource,%d:%s\n",playerContext,url);
      
      	playerContext->mSeekable = 1;
      	if(TPlayerSetDataSource(playerContext->mTPlayer,url,NULL)!= 0)
      	{
      	    printf("TPlayerSetDataSource return fail.\n");
      	    return -1;
      	}else{
      	    printf("setDataSource end\n");
      	}
      	if(TPlayerPrepare(playerContext->mTPlayer)!= 0)
      	{
      	    printf("TPlayerPrepare return fail.\n");
      	    return -1;
      	}else{
      	    printf("TPlayerPrepare end\n");
      	}
      	playerContext->mComplete = 0;
      	playerContext->mError = 0;
      	TPlayerSetDisplayRect(playerContext->mTPlayer, x, y, width, height);
      	#if LOOP_PLAY_FLAG
      	#if !USE_REPEAT_RESET_MODE
      	TPlayerSetLooping(playerContext->mTPlayer,1);
      	#endif
      	#endif
      	#if HOLD_LAST_PICTURE
      	printf("TPlayerSetHoldLastPicture()\n");
      	TPlayerSetHoldLastPicture(playerContext->mTPlayer,1);
      	#else
      	TPlayerSetHoldLastPicture(playerContext->mTPlayer,0);
      	#endif
      	#ifndef ONLY_DISABLE_AUDIO
      	TPlayerSetAudioEQType(playerContext->mTPlayer, AUD_EQ_TYPE_NORMAL);
      	#endif
      	if(TPlayerStart(playerContext->mTPlayer) != 0)
      	{
      	    printf("TPlayerStart() return fail.\n");
      	    return -1;
      	}else{
      	    printf("started.\n");
      	}
      	return 0;
      }
      
      static int createPlayersAndPlayVideos(int argc, char** argv)
      {
          char fileType[FILE_TYPE_NUM][FILE_TYPE_LEN] = {".avi",".mkv",".flv",".ts",".mp4",".ts",".webm",".asf",".mpg",".mpeg",".mov",".vob",".3gp",".wmv",".pmp",".f4v",
                                                                                             ".mp1",".mp2",".mp3",".ogg",".flac",".ape",".wav",".m4a",".amr",".aac",".omg",".oma",".aa3"};
          char* lastStrPos;
          int ret = 0;
      
          for(int i = 0;i < argc-1;i++)
          {
              if((lastStrPos = strrchr(argv[i+1],'.')) != NULL)
              {
                  gPlayerNum = argc -1;
                  if(ret == -1)
                  {
                      printf("has error,break\n");
                      break;
                  }
                  printf("may be is one file:cut down suffix is:%s\n",lastStrPos);
      
                  int j = 0;
                  int findMatchFileFlag = 0;
                  for(j = 0;j < FILE_TYPE_NUM;j++)
                  {
                      if(!strncasecmp(lastStrPos,&(fileType[j]),strlen(&(fileType[j]))))
                      {
                          printf("find the matched type:%s\n",&(fileType[j]));
                          findMatchFileFlag = 1;
                          break;
                      }
                  }
                  if(findMatchFileFlag == 0)
                  {
                      printf("%d:can not play this file:%s\n",i,argv[i]);
                      return -1;
                  }
                  printf("create player:%d\n",i);
                  //* create a player.
                  memset(&gDemoPlayers[i], 0, sizeof(DemoPlayerContext));
                  gDemoPlayers[i].mTPlayer= TPlayerCreate(CEDARX_PLAYER);
                  if(gDemoPlayers[i].mTPlayer == NULL)
                  {
                      printf("can not create tplayer, quit.\n");
                      int count = 0;
                      for(count=i-1;count >= 0;count--)
                      {
                          TPlayerDestroy(gDemoPlayers[count].mTPlayer);
                          gDemoPlayers[count].mTPlayer = NULL;
                      }
                      return -1;
                  }
                  else
                  {
                      printf("create player[%d]:%p\n",i,gDemoPlayers[i].mTPlayer);
                  }
                  //* set callback to player.
                  TPlayerSetNotifyCallback(gDemoPlayers[i].mTPlayer,CallbackForTPlayer, (void*)&gDemoPlayers[i]);
                  #ifndef ONLY_ENABLE_AUDIO
                  if((gScreenWidth == 0 || gScreenHeight == 0) && gDemoPlayers[i].mTPlayer->mLayerCtrl)
                  {
                      VoutRect tmpRect;
                      TPlayerGetDisplayRect(gDemoPlayers[i].mTPlayer,&tmpRect);
                      gScreenWidth = tmpRect.width;
                      gScreenHeight = tmpRect.height;
                      printf("screen width:%d,screen height:%d\n",gScreenWidth,gScreenHeight);
                  }
                  #endif
      
                  switch (argc)
                  {
                      case 2:/*one player*/
                      {
                          printf("%d:playVideo:%d\n",argc-1,i);
                          if(playVideo(&gDemoPlayers[i], argv[i+1], 0, 0, gScreenWidth, gScreenHeight) != 0)
                          {
                              printf("%d:playVideo fail%d\n",argc-1,i);
                              ret = -1;
                          }
                          break;
                      }
      
                      case 3:/*two player*/
                      {
                          printf("%d:playVideo:%d\n",argc-1,i);
                          if(i%2 == 0)
                          {
                              if(playVideo(&gDemoPlayers[i], argv[i+1], 0, 0, gScreenWidth/2, gScreenHeight) != 0)
                              {
                                  printf("%d:playVideo fail%d\n",argc-1,i);
                                  ret = -1;
                              }
                          }
                          else
                          {
                              if(playVideo(&gDemoPlayers[i], argv[i+1], gScreenWidth/2, 0, gScreenWidth/2, gScreenHeight) != 0)
                              {
                                  printf("%d:playVideo fail%d\n",argc-1,i);
                                  ret = -1;
                              }
                          }
                          break;
                      }
      
                      case 4:/*three player*/
                      {
                          printf("%d:playVideo:%d\n",argc-1,i);
                          if(i%3 == 0)
                          {
                              if(playVideo(&gDemoPlayers[i], argv[i+1], 0, 0, gScreenWidth/2, gScreenHeight) != 0)
                              {
                                  printf("%d:playVideo fail%d\n",argc-1,i);
                                  ret = -1;
                              }
                          }
                          else if(i%3 == 1)
                          {
                              if(playVideo(&gDemoPlayers[i], argv[i+1], gScreenWidth/2, 0, gScreenWidth/2, gScreenHeight/2) != 0)
                              {
                                  printf("%d:playVideo fail%d\n",argc-1,i);
                                  ret = -1;
                              }
                          }
                          else
                          {
                              if(playVideo(&gDemoPlayers[i], argv[i+1], gScreenWidth/2, gScreenHeight/2, gScreenWidth/2, gScreenHeight/2) != 0)
                              {
                                  printf("%d:playVideo fail%d\n",argc-1,i);
                                  ret = -1;
                              }
                          }
                          break;
                      }
      
                      case 5:/*four player*/
                      {
                          printf("%d:playVideo:%d\n",argc-1,i);
                          if(i%4 == 0)
                          {
                              if(playVideo(&gDemoPlayers[i], argv[i+1], 0, 0, gScreenWidth/2, gScreenHeight/2) != 0)
                              {
                                  printf("%d:playVideo fail%d\n",argc-1,i);
                                  ret = -1;
                              }
                          }
                          else if(i%4 == 1)
                          {
                              if(playVideo(&gDemoPlayers[i], argv[i+1], 0, gScreenHeight/2, gScreenWidth/2, gScreenHeight/2) != 0)
                              {
                                  printf("%d:playVideo fail%d\n",argc-1,i);
                                  ret = -1;
                              }
                          }
                          else if(i%4 == 2)
                          {
                              if(playVideo(&gDemoPlayers[i], argv[i+1], gScreenWidth/2, 0, gScreenWidth/2, gScreenHeight/2) != 0)
                              {
                                  printf("%d:playVideo fail%d\n",argc-1,i);
                                  ret = -1;
                              }
                          }
                          else
                          {
                              if(playVideo(&gDemoPlayers[i], argv[i+1], gScreenWidth/2, gScreenHeight/2, gScreenWidth/2, gScreenHeight/2) != 0)
                              {
                                  printf("%d:playVideo fail%d\n",argc-1,i);
                                  ret = -1;
                              }
                          }
                          break;
      		}
      
                      default:
                      {
                          printf("do not support play %d videos\n",argc-1);
                          break;
                      }
                  }
              }
              else
              {   /*play all audio and video in one folder*/
                  char fileType[FILE_TYPE_NUM][FILE_TYPE_LEN] = {".avi",".mkv",".flv",".ts",".mp4",".ts",".webm",".asf",".mpg",".mpeg",".mov",".vob",".3gp",".wmv",".pmp",".f4v",
                                                                                             ".mp1",".mp2",".mp3",".ogg",".flac",".ape",".wav",".m4a",".amr",".aac",".omg",".oma",".aa3"};
                  char* lastStrPos;
                  DIR *dir = opendir(argv[1]);
                  if (dir == NULL)
                  {
                      printf("opendir %s fail\n",argv[1]);
                      return -1;
                  }
      
                  isDir = 1;
                  struct dirent *entry;
                  int count= 0;
                  while ((entry = readdir(dir)) != NULL)
                  {
                      printf("file record length = %d,type = %d, name = %s\n",entry->d_reclen,entry->d_type,entry->d_name);
                      if(entry->d_type == 8)
                      {
                          char* strpos;
                          if((strpos = strrchr(entry->d_name,'.')) != NULL)
                          {
                              int i = 0;
                              printf("cut down suffix is:%s\n",strpos);
                              for(i = 0;i < FILE_TYPE_NUM;i++)
                              {
                                  if(!strncasecmp(strpos,&(fileType[i]),strlen(&(fileType[i]))))
                                  {
                                      printf("find the matched type:%s\n",&(fileType[i]));
                                      break;
                                  }
                              }
      
                              if(i < FILE_TYPE_NUM)
                              {
                                  if(count < TOTAL_VIDEO_AUDIO_NUM)
                                  {
                                      strncpy(&demoPlayer.mVideoAudioList[count],entry->d_name,strlen(entry->d_name));
                                      printf("video file name = %s\n",&demoPlayer.mVideoAudioList[count]);
                                      count++;
                                  }
                                  else
                                  {
                                      count++;
                                      printf("warning:the video file in /mnt/UDISK/ is %d,which is larger than %d,we only support %d\n",count,TOTAL_VIDEO_AUDIO_NUM,TOTAL_VIDEO_AUDIO_NUM);
                                  }
                              }
                          }
                      }
                  }
                  closedir(dir);
      
                  demoPlayer.mLoopFlag = 1;
                  demoPlayer.mSetLoop = 1;
                  if(count >  TOTAL_VIDEO_AUDIO_NUM)
                  {
                      demoPlayer.mRealFileNum = TOTAL_VIDEO_AUDIO_NUM;
                  }
                  else
                  {
                      demoPlayer.mRealFileNum = count;
                  }
                  if(demoPlayer.mRealFileNum == 0)
                  {
                      printf("there are no video or audio files in %s,exit(-1)\n",argv[1]);
                      exit(-1);
                  }
      
                  //* create a player.
                  demoPlayer.mTPlayer= TPlayerCreate(CEDARX_PLAYER);
                  if(demoPlayer.mTPlayer == NULL)
                  {
                      printf("can not create tplayer, quit.\n");
                      exit(-1);
                  }
                  //* set callback to player.
                  TPlayerSetNotifyCallback(demoPlayer.mTPlayer,CallbackForTPlayer, (void*)&demoPlayer);
                  #ifndef ONLY_ENABLE_AUDIO
                  if((gScreenWidth == 0 || gScreenHeight == 0) && demoPlayer.mTPlayer->mLayerCtrl)
                  {
                      VoutRect tmpRect;
                      TPlayerGetDisplayRect(demoPlayer.mTPlayer,&tmpRect);
                      gScreenWidth = tmpRect.width;
                      gScreenHeight = tmpRect.height;
                      printf("screen width:%d,screen height:%d\n",gScreenWidth,gScreenHeight);
                  }
                  #endif
                  sem_init(&demoPlayer.mPreparedSem, 0, 0);
              }
      
          }
          return ret;
      }
      
      
      //* the main method.
      int main(int argc, char** argv)
      {
          install_sig_handler();
      
          int  nCommandId;
          unsigned long  nCommandParam;
          int  bQuit = 0;
          char strCommandLine[1024];
          CEDARX_UNUSE(argc);
          CEDARX_UNUSE(argv);
          int waitErr = 0;
          int ret = 0;
          printf("\n");
          printf("******************************************************************************************\n");
          printf("* This program implements a simple player, you can type commands to control the player.\n");
          printf("* To show what commands supported, type 'help'.\n");
          printf("******************************************************************************************\n");
          if(((access("/dev/zero",F_OK)) < 0)||((access("/dev/fb0",F_OK)) < 0)){
              printf("/dev/zero OR /dev/fb0 is not exit\n");
          }else{
              system("dd if=/dev/zero of=/dev/fb0");//clean the framebuffer
          }
      
          if(argc > 1 && argc < 6)   /* can play 1-4 video*/
          {
              printf("argc = %d\n",argc);
              int argc_count=0;
              for(argc_count=0;argc_count < argc;argc_count++)
              {
                  printf("argv[%d] = %s\n",argc_count,argv[argc_count]);
              }
      
              ret = createPlayersAndPlayVideos(argc, argv);
              if(ret == -1)
                  goto QUIT;
      
              while(!bQuit)
              {
                  if(isDir)
                  {
                      if(demoPlayer.mLoopFlag)
                      {
                          demoPlayer.mLoopFlag = 0;
                          printf("TPlayerReset begin\n");
                          if(TPlayerReset(demoPlayer.mTPlayer) != 0)
                          {
                              printf("TPlayerReset return fail.\n");
                          }
                          else
                          {
                              printf("reset the player ok.\n");
                              if(demoPlayer.mError == 1)
                              {
                                  demoPlayer.mError = 0;
                              }
                              //PowerManagerReleaseWakeLock("tplayerdemo");
                          }
                          demoPlayer.mSeekable = 1;   //* if the media source is not seekable, this flag will be
                                                                          //* clear at the TINA_NOTIFY_NOT_SEEKABLE callback.
                          if(demoPlayer.mCurPlayIndex == demoPlayer.mRealFileNum)
                          {
                              demoPlayer.mCurPlayIndex = 0;
                          }
      
                          strcpy(demoPlayer.mUrl,argv[1]);
                          strcat(demoPlayer.mUrl,&demoPlayer.mVideoAudioList[demoPlayer.mCurPlayIndex]);
                          printf("demoPlayer.mUrl = %s\n",demoPlayer.mUrl);
                          demoPlayer.mCurPlayIndex++;
                          //* set url to the tinaplayer.
                          if(TPlayerSetDataSource(demoPlayer.mTPlayer,(const char*)demoPlayer.mUrl,NULL) != 0)
                          {
                              printf("TPlayerSetDataSource() return fail.\n");
                          }
                          else
                          {
                              printf("TPlayerSetDataSource() end\n");
                          }
      
                          demoPlayer.mPreparedFlag = 0;
                          if(TPlayerPrepareAsync(demoPlayer.mTPlayer) != 0)
                          {
                              printf("TPlayerPrepareAsync() return fail.\n");
                          }
                          else
                          {
                              printf("preparing...\n");
                          }
                          waitErr = semTimedWait(&demoPlayer.mPreparedSem,300*1000);
                          if(waitErr == -1)
                          {
                              printf("prepare fail,has wait 300s\n");
                              break;
                          }
                          else if(demoPlayer.mError == 1)
                          {
                              printf("prepare fail\n");
                              break;
                          }
                          printf("prepare ok\n");
      
                          #if HOLD_LAST_PICTURE
                          printf("TPlayerSetHoldLastPicture()\n");
                          TPlayerSetHoldLastPicture(demoPlayer.mTPlayer,1);
                          #else
                          TPlayerSetHoldLastPicture(demoPlayer.mTPlayer,0);
                          #endif
                          printf("start play\n");
                          //TPlayerSetLooping(demoPlayer.mTPlayer,1);//let the player into looping mode
                          //* start the playback
                          if(TPlayerStart(demoPlayer.mTPlayer) != 0)
                          {
                              printf("TPlayerStart() return fail.\n");
                          }
                          else
                          {
                              printf("started.\n");
                              //PowerManagerAcquireWakeLock("tplayerdemo");
                          }
                      }
                  }
                  else
                  {
                      #if LOOP_PLAY_FLAG
                      for(int i = 0;i < argc-1;i++)
                      {
                          if(gDemoPlayers[i].mComplete == 1)
                          {
                              printf("TPlayerReset begin\n");
                              if(TPlayerReset(gDemoPlayers[i].mTPlayer) != 0)
                              {
                                  printf("TPlayerReset return fail.\n");
                              }
                              else
                              {
                                  printf("reset the player ok.\n");
                              }
      
                              switch (argc)
                              {
                                  case 2:/*one player*/
                                  {
                                      printf("%d:playVideo:%d\n",argc-1,i);
                                      if(playVideo(&gDemoPlayers[i], argv[i+1], 0, 0, gScreenWidth, gScreenHeight) != 0)
                                      {
                                          printf("%d:playVideo fail%d\n",argc-1,i);
                                          goto QUIT;
                                      }
                                      break;
                                  }
      
                                  case 3:/*two player*/
                                  {
                                      printf("%d:playVideo:%d\n",argc-1,i);
                                      if(i%2 == 0)
                                      {
                                          if(playVideo(&gDemoPlayers[i], argv[i+1], 0, 0, gScreenWidth/2, gScreenHeight) != 0)
                                          {
                                              printf("%d:playVideo fail%d\n",argc-1,i);
                                              goto QUIT;
                                          }
                                      }
                                      else
                                      {
                                          if(playVideo(&gDemoPlayers[i], argv[i+1], gScreenWidth/2, 0, gScreenWidth/2, gScreenHeight) != 0)
                                          {
                                              printf("%d:playVideo fail%d\n",argc-1,i);
                                              goto QUIT;
                                          }
                                      }
                                      break;
                                  }
      
                                  case 4:/*three player*/
                                  {
                                      printf("%d:playVideo:%d\n",argc-1,i);
                                      if(i%3 == 0)
                                      {
                                          if(playVideo(&gDemoPlayers[i], argv[i+1], 0, 0, gScreenWidth/2, gScreenHeight) != 0)
                                          {
                                              printf("%d:playVideo fail%d\n",argc-1,i);
                                              goto QUIT;
                                          }
                                      }
                                      else if(i%3 == 1)
                                      {
                                          if(playVideo(&gDemoPlayers[i], argv[i+1], gScreenWidth/2, 0, gScreenWidth/2, gScreenHeight/2) != 0)
                                          {
                                              printf("%d:playVideo fail%d\n",argc-1,i);
                                              goto QUIT;
                                          }
                                      }
                                      else
                                      {
                                          if(playVideo(&gDemoPlayers[i], argv[i+1], gScreenWidth/2, gScreenHeight/2, gScreenWidth/2, gScreenHeight/2) != 0)
                                          {
                                              printf("%d:playVideo fail%d\n",argc-1,i);
                                              goto QUIT;
                                          }
                                      }
                                      break;
                                  }
      
                                  case 5:/*four player*/
                                  {
                                      printf("%d:playVideo:%d\n",argc-1,i);
                                      if(i%4 == 0)
                                      {
                                          if(playVideo(&gDemoPlayers[i], argv[i+1], 0, 0, gScreenWidth/2, gScreenHeight/2) != 0)
                                          {
                                              printf("%d:playVideo fail%d\n",argc-1,i);
                                              goto QUIT;
                                          }
                                      }
                                      else if(i%4 == 1)
                                      {
                                          if(playVideo(&gDemoPlayers[i], argv[i+1], 0, gScreenHeight/2, gScreenWidth/2, gScreenHeight/2) != 0)
                                          {
                                              printf("%d:playVideo fail%d\n",argc-1,i);
                                              goto QUIT;
                                          }
                                      }
                                      else if(i%4 == 2)
                                      {
                                          if(playVideo(&gDemoPlayers[i], argv[i+1], gScreenWidth/2, 0, gScreenWidth/2, gScreenHeight/2) != 0)
                                          {
                                              printf("%d:playVideo fail%d\n",argc-1,i);
                                              goto QUIT;
                                          }
                                      }
                                      else
                                      {
                                          if(playVideo(&gDemoPlayers[i], argv[i+1], gScreenWidth/2, gScreenHeight/2, gScreenWidth/2, gScreenHeight/2) != 0)
                                          {
                                              printf("%d:playVideo fail%d\n",argc-1,i);
                                              goto QUIT;
                                          }
                                      }
                                      break;
                                  }
      
                                  default:
                                  {
                                      printf("do not support play %d videos\n",argc-1);
                                      break;
                                  }
                              }
                          }
                      }
                      #endif
                  }
      
                  //* read command from stdin.
                  if(readCommand(strCommandLine, sizeof(strCommandLine)) == 0)
                  {
                      //* parse command.
                      nCommandParam = 0;
                      nCommandId = parseCommandLine(strCommandLine, &nCommandParam);
                      //* process command.
                      switch(nCommandId)
                      {
                          case COMMAND_HELP:
                          {
                              showHelp();
                              break;
                          }
      
                          case COMMAND_QUIT:
                          {
                              printf("COMMAND_QUIT\n");
                              bQuit = 1;
                              break;
                          }
                      }
                  }
              }
      
          QUIT:
              if(isDir)
              {
                  if(demoPlayer.mTPlayer != NULL)
                  {
                      TPlayerDestroy(demoPlayer.mTPlayer);
                      demoPlayer.mTPlayer = NULL;
                      printf("TPlayerDestroy() successfully\n");
                  }
      
                  printf("destroy tplayer \n");
                  sem_destroy(&demoPlayer.mPreparedSem);
              }
              else
              {
                  int i=0;
                  for(i = (argc-1)-1;i >= 0;i--)
                  {
                      if(gDemoPlayers[i].mTPlayer != NULL)
                      {
                          TPlayerDestroy(gDemoPlayers[i].mTPlayer);
                          gDemoPlayers[i].mTPlayer = NULL;
                          printf("TPlayerDestroy(%d) successfully\n",i);
                      }
                  }
                  printf("destroy all tplayer\n");
              }
              //PowerManagerReleaseWakeLock("tplayerdemo");
              printf("\n");
              printf("******************************************************************************************\n");
              printf("* Quit the program, goodbye!\n");
              printf("******************************************************************************************\n");
              printf("\n");
              return 0;
          }
      
          if(argc == 1)
          {/*use command to control one player*/
              memset(&demoPlayer, 0, sizeof(DemoPlayerContext));
              demoPlayer.mError = 0;
              demoPlayer.mSeekable = 1;
              demoPlayer.mPreparedFlag = 0;
              demoPlayer.mLoopFlag = 0;
              demoPlayer.mSetLoop = 0;
              demoPlayer.mMediaInfo = NULL;
              //* create a player.
              demoPlayer.mTPlayer= TPlayerCreate(CEDARX_PLAYER);
              if(demoPlayer.mTPlayer == NULL)
              {
                  printf("can not create tplayer, quit.\n");
                  exit(-1);
              }
              //* set callback to player.
              TPlayerSetNotifyCallback(demoPlayer.mTPlayer,CallbackForTPlayer, (void*)&demoPlayer);
              #ifndef ONLY_ENABLE_AUDIO
              if((gScreenWidth == 0 || gScreenHeight == 0) && demoPlayer.mTPlayer->mLayerCtrl)
              {
                  VoutRect tmpRect;
                  TPlayerGetDisplayRect(demoPlayer.mTPlayer,&tmpRect);
                  gScreenWidth = tmpRect.width;
                  gScreenHeight = tmpRect.height;
                  printf("screen width:%d,screen height:%d\n",gScreenWidth,gScreenHeight);
              }
              #endif
              sem_init(&demoPlayer.mPreparedSem, 0, 0);
              //* read, parse and process command from user.
              bQuit = 0;
              while(!bQuit)
              {
                  //for test loop play which use reset for each play
                  //printf("demoPlayer.mLoopFlag = %d",demoPlayer.mLoopFlag);
                  if(demoPlayer.mLoopFlag)
                  {
                      demoPlayer.mLoopFlag = 0;
                      printf("TPlayerReset begin\n");
                      if(TPlayerReset(demoPlayer.mTPlayer) != 0)
                      {
                          printf("TPlayerReset return fail.\n");
                      }
                      else
                      {
                          printf("reset the player ok.\n");
                          if(demoPlayer.mError == 1)
                          {
                              demoPlayer.mError = 0;
                          }
                          //PowerManagerReleaseWakeLock("tplayerdemo");
                      }
                      demoPlayer.mSeekable = 1;   //* if the media source is not seekable, this flag will be
                                                                          //* clear at the TINA_NOTIFY_NOT_SEEKABLE callback.
      
                      //* set url to the tplayer.
                      if(TPlayerSetDataSource(demoPlayer.mTPlayer,(const char*)demoPlayer.mUrl,NULL) != 0)
                      {
                          printf("TPlayerSetDataSource() return fail.\n");
                      }
                      else
                      {
                          printf("TPlayerSetDataSource() end\n");
                      }
                      demoPlayer.mPreparedFlag = 0;
                      if(TPlayerPrepareAsync(demoPlayer.mTPlayer) != 0)
                      {
                          printf("TPlayerPrepareAsync() return fail.\n");
                      }
                      else
                      {
                          printf("preparing...\n");
                      }
                      waitErr = semTimedWait(&demoPlayer.mPreparedSem,300*1000);
                      if(waitErr == -1)
                      {
                          printf("prepare fail,has wait 300s\n");
                          break;
                      }
                      else if(demoPlayer.mError == 1)
                      {
                          printf("prepare fail\n");
                          break;
                      }
                      printf("prepare ok\n");
                      #if HOLD_LAST_PICTURE
                      printf("TPlayerSetHoldLastPicture()\n");
                      TPlayerSetHoldLastPicture(demoPlayer.mTPlayer,1);
                      #else
                      TPlayerSetHoldLastPicture(demoPlayer.mTPlayer,0);
                      #endif
                      printf("start play\n");
                      //TPlayerSetLooping(demoPlayer.mTPlayer,1);//let the player into looping mode
                      //* start the playback
                      if(TPlayerStart(demoPlayer.mTPlayer) != 0)
                      {
                          printf("TPlayerStart() return fail.\n");
                      }
                      else
                      {
                          printf("started.\n");
                          //PowerManagerAcquireWakeLock("tplayerdemo");
                      }
                  }
      
                  //* read command from stdin.
                  if(readCommand(strCommandLine, sizeof(strCommandLine)) == 0)
                  {
                      //* parse command.
                      nCommandParam = 0;
                      nCommandId = parseCommandLine(strCommandLine, &nCommandParam);
                      //* process command.
                      switch(nCommandId)
                      {
                          case COMMAND_HELP:
                          {
                              showHelp();
                              break;
                          }
      
                          case COMMAND_QUIT:
                          {
                              printf("COMMAND_QUIT\n");
                              bQuit = 1;
                              break;
                          }
      
                          case COMMAND_SET_SOURCE :   //* set url of media file.
                          {
                              char* pUrl;
                              pUrl = (char*)(uintptr_t)nCommandParam;
                              memset(demoPlayer.mUrl,0,512);
                              strcpy(demoPlayer.mUrl,pUrl);
                              printf("demoPlayer.mUrl = %s\n",demoPlayer.mUrl);
                              if(demoPlayer.mError == 1) //pre status is error,reset the player first
                              {
                                  printf("pre status is error,reset the tina player first.\n");
                                  TPlayerReset(demoPlayer.mTPlayer);
                                  demoPlayer.mError = 0;
                              }
      
                              demoPlayer.mSeekable = 1;   //* if the media source is not seekable, this flag will be
                                                                              //* clear at the TINA_NOTIFY_NOT_SEEKABLE callback.
                              //* set url to the tinaplayer.
                              if(TPlayerSetDataSource(demoPlayer.mTPlayer,(const char*)demoPlayer.mUrl,NULL) != 0)
                              {
                                  printf("TPlayerSetDataSource() return fail.\n");
                                  break;
                              }
                              else
                              {
                                  printf("setDataSource end\n");
                              }
                              break;
                          }
      
                          case COMMAND_PREPARE:
                          {
                              demoPlayer.mPreparedFlag = 0;
                              if(TPlayerPrepareAsync(demoPlayer.mTPlayer) != 0)
                              {
                                  printf("TPlayerPrepareAsync() return fail.\n");
                              }
                              else
                              {
                                  printf("prepare\n");
                              }
                              waitErr = semTimedWait(&demoPlayer.mPreparedSem,300*1000);
                              if(waitErr == -1)
                              {
                                  printf("prepare fail,has wait 300s\n");
                                  break;
                              }
                              else if(demoPlayer.mError == 1)
                              {
                                  printf("prepare fail\n");
                                  break;
                              }
                              printf("prepared ok\n");
                              break;
                          }
      
                          case COMMAND_PLAY:   //* start playback.
                          {
                              #if HOLD_LAST_PICTURE
                              printf("TPlayerSetHoldLastPicture()\n");
                              TPlayerSetHoldLastPicture(demoPlayer.mTPlayer,1);
                              #else
                              TPlayerSetHoldLastPicture(demoPlayer.mTPlayer,0);
                              #endif
                              if(TPlayerStart(demoPlayer.mTPlayer) != 0)
                              {
                                  printf("TPlayerStart() return fail.\n");
                                  break;
                              }
                              else
                              {
                                  printf("started.\n");
                                  //PowerManagerAcquireWakeLock("tplayerdemo");
                              }
                              break;
                          }
      
                          case COMMAND_PAUSE:   //* pause the playback.
                          {
                              if(TPlayerPause(demoPlayer.mTPlayer) != 0)
                              {
                                  printf("TPlayerPause() return fail.\n");
                                  break;
                              }
                              else
                              {
                                  printf("paused.\n");
                                  //PowerManagerReleaseWakeLock("tplayerdemo");
                              }
                              break;
                          }
      
                          case COMMAND_STOP:   //* stop the playback.
                          {
                              if(TPlayerStop(demoPlayer.mTPlayer) != 0)
                              {
                                  printf("TPlayerStop() return fail.\n");
                                  break;
                              }
                              else
                              {
                                  //PowerManagerReleaseWakeLock("tplayerdemo");
                              }
                              break;
                          }
      
                          case COMMAND_SEEKTO:   //* seek to posion, in unit of second.
                          {
                              int nSeekTimeMs;
                              int nDuration;
                              nSeekTimeMs = nCommandParam*1000;
                              int ret = TPlayerGetDuration(demoPlayer.mTPlayer,&nDuration);
                              printf("nSeekTimeMs = %d , nDuration = %d\n",nSeekTimeMs,nDuration);
                              if(ret != 0)
                              {
                                  printf("getDuration fail, unable to seek!\n");
                                  break;
                              }
      
                              if(nSeekTimeMs > nDuration)
                              {
                                  printf("seek time out of range, media duration = %d seconds.\n", nDuration/1000);
                                  break;
                              }
                              if(demoPlayer.mSeekable == 0)
                              {
                                  printf("media source is unseekable.\n");
                                  break;
                              }
                              if(TPlayerSeekTo(demoPlayer.mTPlayer,nSeekTimeMs) != 0)
                              {
                                  printf("TPlayerSeekTo() return fail,nSeekTimeMs= %d\n",nSeekTimeMs);
                                  break;
                              }
                              else
                              {
                                  printf("is seeking.\n");
                              }
                              break;
                          }
      
                          case COMMAND_RESET:   //* reset the player
                          {
                              if(TPlayerReset(demoPlayer.mTPlayer) != 0)
                              {
                                  printf("TPlayerReset() return fail.\n");
                                  break;
                              }
                              else
                              {
                                  printf("reset the player ok.\n");
                                  //PowerManagerReleaseWakeLock("tinaplayerdemo");
                              }
                              break;
                          }
      
                          case COMMAND_SHOW_MEDIAINFO:   //* show media information.
                          {
                              printf("show media information:\n");
                              MediaInfo* mi = NULL;
                              demoPlayer.mMediaInfo = TPlayerGetMediaInfo(demoPlayer.mTPlayer);
                              if(demoPlayer.mMediaInfo != NULL)
                              {
                                  mi = demoPlayer.mMediaInfo;
                                  printf("file size = %lld KB\n",mi->nFileSize/1024);
                                  printf("duration = %lld ms\n",mi->nDurationMs);
                                  printf("bitrate = %d Kbps\n",mi->nBitrate/1024);
                                  printf("container type = %d\n",mi->eContainerType);
                                  #ifndef ONLY_ENABLE_AUDIO
                                  printf("video stream num = %d\n",mi->nVideoStreamNum);
                                  #endif
                                  printf("audio stream num = %d\n",mi->nAudioStreamNum);
                                  #ifndef ONLY_ENABLE_AUDIO
                                  printf("subtitle stream num = %d\n",mi->nSubtitleStreamNum);
                                  if(mi->pVideoStreamInfo != NULL)
                                  {
                                      printf("video codec tpye = %d\n",mi->pVideoStreamInfo->eCodecFormat);
                                      printf("video width = %d\n",mi->pVideoStreamInfo->nWidth);
                                      printf("video height = %d\n",mi->pVideoStreamInfo->nHeight);
                                      printf("video framerate = %d\n",mi->pVideoStreamInfo->nFrameRate);
                                      printf("video frameduration = %d\n",mi->pVideoStreamInfo->nFrameDuration);
                                  }
                                  #endif
                                  if(mi->pAudioStreamInfo != NULL)
                                  {
                                      printf("audio codec tpye = %d\n",mi->pAudioStreamInfo->eCodecFormat);
                                      printf("audio channel num = %d\n",mi->pAudioStreamInfo->nChannelNum);
                                      printf("audio BitsPerSample = %d\n",mi->pAudioStreamInfo->nBitsPerSample);
                                      printf("audio sample rate  = %d\n",mi->pAudioStreamInfo->nSampleRate);
                                      printf("audio bitrate = %d Kbps\n",mi->pAudioStreamInfo->nAvgBitrate/1024);
                                  }
      
                              }
                              break;
                          }
      
                          case COMMAND_SHOW_DURATION:   //* show media duration, in unit of second.
                          {
                              int nDuration = 0;
                              if(TPlayerGetDuration(demoPlayer.mTPlayer,&nDuration) == 0)
                                  printf("media duration = %d seconds.\n", nDuration/1000);
                              else
                                  printf("fail to get media duration.\n");
                              break;
                          }
      
                          case COMMAND_SHOW_POSITION:   //* show current play position, in unit of second.
                          {
                              int nPosition = 0;
                              if(TPlayerGetCurrentPosition(demoPlayer.mTPlayer,&nPosition) == 0)
                                  printf("current position = %d seconds.\n", nPosition/1000);
                              else
                                  printf("fail to get pisition.\n");
                              break;
                          }
      
                          case COMMAND_GET_DISP_FRAMERATE:   //* get video real disp framerate
                          {
                              float realDispFramerate = 0.0;
                              int getFramerateRet = TPlayerGetVideoDispFramerate(demoPlayer.mTPlayer,&realDispFramerate);
                              if(getFramerateRet == -1)
                                  printf("err:we should get the real display framerate after play\n");
                              else
                                  printf("real display framerate : %f\n",realDispFramerate);
                              break;
                          }
      
                          case COMMAND_SWITCH_AUDIO:   //* switch autio track.
                          {
                              int audioStreamIndex;
                              audioStreamIndex = (int)nCommandParam;
                              printf("switch audio to the %dth track.\n", audioStreamIndex);
                              int ret = TPlayerSwitchAudio(demoPlayer.mTPlayer,audioStreamIndex);
                              if(ret != 0){
                                  printf("switch audio err\n");
                              }
                              break;
                          }
      
                          case COMMAND_PLAY_URL:   //* set url of media file.
                          {
                              char* pUrl;
                              pUrl = (char*)(uintptr_t)nCommandParam;
                              memset(demoPlayer.mUrl,0,512);
                              strcpy(demoPlayer.mUrl,pUrl);
                              printf("demoPlayer.mUrl = %s",demoPlayer.mUrl);
                              if(TPlayerReset(demoPlayer.mTPlayer) != 0)
                              {
                                  printf("TPlayerReset() return fail.\n");
                                  break;
                              }
                              else
                              {
                                  printf("reset the player ok.\n");
                                  if(demoPlayer.mError == 1)
                                  {
                                      demoPlayer.mError = 0;
                                  }
                                  //PowerManagerReleaseWakeLock("tplayerdemo");
                              }
                              demoPlayer.mSeekable = 1;   //* if the media source is not seekable, this flag will be
                                  //* clear at the TINA_NOTIFY_NOT_SEEKABLE callback.
                              //* set url to the tinaplayer.
                              if(TPlayerSetDataSource(demoPlayer.mTPlayer,(const char*)demoPlayer.mUrl,NULL)!= 0)
                              {
                                  printf("TPlayerSetDataSource return fail.\n");
                                  break;
                              }
                              else
                              {
                                  printf("setDataSource end\n");
                              }
      
                              demoPlayer.mPreparedFlag = 0;
                              if(TPlayerPrepareAsync(demoPlayer.mTPlayer) != 0)
                              {
                                  printf("TPlayerPrepareAsync() return fail.\n");
                              }
                              else
                              {
                                  printf("preparing...\n");
                              }
                              waitErr = semTimedWait(&demoPlayer.mPreparedSem,300*1000);
                              if(waitErr == -1)
                              {
                                  printf("prepare fail,has wait 300s\n");
                                  break;
                              }
                              else if(demoPlayer.mError == 1)
                              {
                                  printf("prepare fail\n");
                                  break;
                              }
                              printf("prepared ok\n");
                              #if HOLD_LAST_PICTURE
                              printf("TPlayerSetHoldLastPicture()\n");
                              TPlayerSetHoldLastPicture(demoPlayer.mTPlayer,1);
                              #else
                              TPlayerSetHoldLastPicture(demoPlayer.mTPlayer,0);
                              #endif
                              printf("start play \n");
                              //TPlayerSetLooping(demoPlayer.mTPlayer,1);//let the player into looping mode
                              //* start the playback
                              if(TPlayerStart(demoPlayer.mTPlayer) != 0)
                              {
                                  printf("TPlayerStart() return fail.\n");
                                  break;
                              }
                              else
                              {
                                  printf("started.\n");
                                  //PowerManagerAcquireWakeLock("tplayerdemo");
                              }
                              break;
                          }
      
                          case COMMAND_SET_VOLUME:   //* seek to posion, in unit of second.
                          {
                              int volume = (int)nCommandParam;
                              printf("tplayerdemo setVolume:volume = %d\n",volume);
                              int ret = TPlayerSetVolume(demoPlayer.mTPlayer,volume);
                              if(ret == -1)
                              {
                                  printf("tplayerdemo set volume err\n");
                              }
                              else
                              {
                                  printf("tplayerdemo set volume ok\n");
                              }
                              break;
                          }
      
                          case COMMAND_GET_VOLUME:   //* seek to posion, in unit of second.
                          {
                              int curVolume = TPlayerGetVolume(demoPlayer.mTPlayer);
                              printf("cur volume = %d\n",curVolume);
                              break;
                          }
      
                          case COMMAND_SET_LOOP:   //* set loop flag
                          {
                              printf("tplayerdemo set loop flag:flag = %d\n",(int)nCommandParam);
                              if(nCommandParam == 1)
                              {
                                  demoPlayer.mSetLoop = 1;
                              }
                              else if(nCommandParam == 0)
                              {
                                  demoPlayer.mSetLoop = 0;
                              }
                              else
                              {
                                  printf("the set loop value is wrong\n");
                              }
                              break;
                          }
      
                          case COMMAND_SET_SCALEDOWN:   //set video scaledown
                          {
                              int scaleDown = (int)nCommandParam;
                              printf("tplayerdemo set scaledown value = %d\n",scaleDown);
                              switch (scaleDown)
                              {
                                  case 2:
                                  {
                                      printf("scale down 1/2\n");
                                      int ret = TPlayerSetScaleDownRatio(demoPlayer.mTPlayer,TPLAYER_VIDEO_SCALE_DOWN_2,TPLAYER_VIDEO_SCALE_DOWN_2);
                                      if(ret != 0){
                                          printf("set scale down err\n");
                                      }
                                      break;
                                  }
      
                                  case 4:
                                  {
                                      printf("scale down 1/4\n");
                                      int ret = TPlayerSetScaleDownRatio(demoPlayer.mTPlayer,TPLAYER_VIDEO_SCALE_DOWN_4,TPLAYER_VIDEO_SCALE_DOWN_4);
                                      if(ret != 0){
                                          printf("set scale down err\n");
                                      }
                                      break;
                                  }
      
                                  case 8:
                                  {
                                      printf("scale down 1/8\n");
                                      int ret = TPlayerSetScaleDownRatio(demoPlayer.mTPlayer,TPLAYER_VIDEO_SCALE_DOWN_8,TPLAYER_VIDEO_SCALE_DOWN_8);
                                      if(ret != 0){
                                          printf("set scale down err\n");
                                      }
                                      break;
                                  }
                                  default:
                                  {
                                      printf("scaledown value is wrong\n");
                                      break;
                                  }
                              }
                              break;
                          }
      
                          case COMMAND_FAST_FORWARD:   //fast forward
                          {
                              int fastForwardTimes = (int)nCommandParam;
                              printf("tplayerdemo fast forward times = %d\n",fastForwardTimes);
      
                              switch (fastForwardTimes)
                              {
                                  case 2:
                                  {
                                      printf("fast forward 2 times\n");
                                      int ret = TPlayerSetSpeed(demoPlayer.mTPlayer,PLAY_SPEED_FAST_FORWARD_2);
                                      if(ret != 0){
                                          printf("fast forward err\n");
                                      }
                                      break;
                                  }
      
                                  case 4:
                                  {
                                      printf("fast forward 4 times\n");
                                      int ret = TPlayerSetSpeed(demoPlayer.mTPlayer,PLAY_SPEED_FAST_FORWARD_4);
                                      if(ret != 0){
                                          printf("fast forward err\n");
                                      }
                                      break;
                                  }
      
                                  case 8:
                                  {
                                      printf("fast forward 8 times\n");
                                      int ret = TPlayerSetSpeed(demoPlayer.mTPlayer,PLAY_SPEED_FAST_FORWARD_8);
                                      if(ret != 0){
                                          printf("fast forward err\n");
                                      }
                                      break;
                                  }
      
                                  case 16:
                                  {
                                      printf("fast forward 16 times\n");
                                      int ret = TPlayerSetSpeed(demoPlayer.mTPlayer,PLAY_SPEED_FAST_FORWARD_16);
                                      if(ret != 0){
                                          printf("fast forward err\n");
                                      }
                                      break;
                                  }
      
                                  default:
                                  {
                                      printf("the value of fast forward times is wrong,can not fast forward. value = %d\n",fastForwardTimes);
                                      printf("we set it to normal play\n");
                                      TPlayerSetSpeed(demoPlayer.mTPlayer,PLAY_SPEED_1);
                                      break;
                                  }
                              }
                              break;
                          }
      
                          case COMMAND_FAST_BACKWARD:   //fast backward
                          {
                              int fastBackwardTimes = (int)nCommandParam;
                              printf("tplayerdemo fast backward times = %d\n",fastBackwardTimes);
      
                              switch (fastBackwardTimes)
                              {
                                  case 2:
                                  {
                                      printf("fast backward 2 times\n");
                                      int ret = TPlayerSetSpeed(demoPlayer.mTPlayer,PLAY_SPEED_FAST_BACKWARD_2);
                                      if(ret != 0){
                                          printf("fast backward err\n");
                                      }
                                      break;
                                  }
      
                                  case 4:
                                  {
                                      printf("fast backward 4 times\n");
                                      int ret = TPlayerSetSpeed(demoPlayer.mTPlayer,PLAY_SPEED_FAST_BACKWARD_4);
                                      if(ret != 0){
                                          printf("fast backward err\n");
                                      }
                                      break;
                                  }
      
                                  case 8:
                                  {
                                      printf("fast backward 8 times\n");
                                      int ret = TPlayerSetSpeed(demoPlayer.mTPlayer,PLAY_SPEED_FAST_BACKWARD_8);
                                      if(ret != 0){
                                          printf("fast backward err\n");
                                      }
                                      break;
                                  }
      
                                  case 16:
                                  {
                                      printf("fast backward 16 times\n");
                                      int ret = TPlayerSetSpeed(demoPlayer.mTPlayer,PLAY_SPEED_FAST_BACKWARD_16);
                                      if(ret != 0){
                                          printf("fast backward err\n");
                                      }
                                      break;
                                  }
      
                                  default:
                                  {
                                      printf("the value of fast backward times is wrong,can not fast backward. value = %d\n",fastBackwardTimes);
                                      printf("we set it to normal play\n");
                                      TPlayerSetSpeed(demoPlayer.mTPlayer,PLAY_SPEED_1);
                                      break;
                                  }
                              }
                              break;
                          }
                          case COMMAND_SET_SRC_RECT:
                          {
                              TPlayerSetSrcRect(demoPlayer.mTPlayer, 0, 0, 720, 480);
                              break;
                          }
                          case COMMAND_SET_OUTPUT_RECT:
                          {
                              TPlayerSetDisplayRect(demoPlayer.mTPlayer, 0, 0, 400, 400);
                              break;
                          }
                      }
                  }
              }
      
              if(demoPlayer.mTPlayer != NULL)
              {
                  TPlayerDestroy(demoPlayer.mTPlayer);
                  demoPlayer.mTPlayer = NULL;
                  printf("TPlayerDestroy() successfully\n");
              }
      
              printf("destroy tplayer \n");
      
              sem_destroy(&demoPlayer.mPreparedSem);
      
              //PowerManagerReleaseWakeLock("tplayerdemo");
              printf("\n");
              printf("******************************************************************************************\n");
              printf("* Quit the program, goodbye!\n");
              printf("******************************************************************************************\n");
              printf("\n");
      
              return 0;
          }
      }
      
      
      发布在 V Series
      A
      awwwwa
    • 回复: uvc例子编译出错

      @sofia libcedarx

      发布在 V Series
      A
      awwwwa
    • 回复: D1 用Xfel启动不了内核

      @geniusz 自带的uboot的bootm命令会自动解压,主线的需要自行配置

      发布在 MR Series
      A
      awwwwa
    • 回复: uvc例子编译出错

      @sofia 关闭tina_multimedia

      发布在 V Series
      A
      awwwwa
    • 回复: V853s如何实现UI图层和视频图层同时用

      @hzhy1234 tplayerdemo就调用了

      发布在 V Series
      A
      awwwwa
    • 回复: D1s i80 接 ST7789V uboot有显示进入 Linux 没显示黑屏了

      @awwwwa 在 D1s i80 接 ST7789V uboot有显示进入 Linux 没显示黑屏了 中说:

      lcd_gpio_0 = <&pio PD 0 GPIO_ACTIVE_LOW>;

      配置成 lcd_gpio_0 = <&pio PD 0 GPIO_ACTIVE_HIGH>; 解决,Uboot 初始化后又拉低了rst脚

      发布在 MR Series
      A
      awwwwa
    • D1s i80 接 ST7789V uboot有显示进入 Linux 没显示黑屏了

      D1s i80 接 ST7789V uboot有显示进入 Linux 没显示黑屏了

      设备树这样配置的

      &disp {
      	disp_init_enable         = <1>;
      	disp_mode                = <0>;
      
      	screen0_output_type      = <1>;
      	screen0_output_mode      = <4>;
      
      	screen1_output_type      = <3>;
      	screen1_output_mode      = <4>;
      	
      	screen1_output_format    = <0>;
      	screen1_output_bits      = <0>;
      	screen1_output_eotf      = <4>;
      	screen1_output_cs        = <257>;
      	screen1_output_dvi_hdmi  = <2>;
      	screen1_output_range     = <2>;
      	screen1_output_scan      = <0>;
      	screen1_output_aspect_ratio = <8>;
      	dev0_output_type         = <1>;
      	dev0_output_mode         = <4>;
      	dev0_screen_id           = <0>;
      	dev0_do_hpd              = <0>;
      
      	dev1_output_type         = <4>;
      	dev1_output_mode         = <10>;
      	dev1_screen_id           = <1>;
      	dev1_do_hpd              = <1>;
      
      	def_output_dev           = <0>;
      	hdmi_mode_check          = <1>;
      	disp_rotation_used		 = <1>;
      	degree0					 = <0>;
      	fb0_format               = <0>;
      	fb0_buffer_num           = <1>;	
      	/*fb0_width                = <800>;*/
      	/*fb0_height               = <480>;*/  /*read from lcd*/
      	fb1_format               = <0>;
      	fb1_width                = <0>;
      	fb1_height               = <0>;
      	chn_cfg_mode             = <1>;
      
      	disp_para_zone           = <1>;
      	/*VCC-LCD*/
      /*	dc1sw-supply = <&reg_dc1sw>;*/
      	/*VCC-DSI*/
      /*	eldo3-supply = <&reg_eldo3>;*/
      	/*VCC-PD*/
      /*	dcdc1-supply = <&reg_dcdc1>;*/
      };
      
      &lcd0 {
      	lcd_used            = <1>;
      
          lcd_driver_name     = "st7789v_cpu2";
      
      	/* part 2 */
      	lcd_if = <1>;
      	lcd_cpu_if = <8>;
      
      	/* part 3 */
      	lcd_width = <23>;
      	lcd_height = <43>;
      	lcd_x = <320>;
      	lcd_y = <240>;
      	lcd_dclk_freq = <6>;
      	lcd_hbp = <34>;
      	lcd_ht = <384>;
      	lcd_hspw = <10>;
      	lcd_vbp = <14>;
      	lcd_vt = <260>;
      	lcd_vspw = <4>;
      
      	/* part 4 */
      	lcd_backlight = <50>;
      	lcd_pwm_used = <1>;
      	lcd_pwm_ch = <7>;
      	lcd_pwm_freq = <20000>;
      	lcd_pwm_pol = <1>;
      	lcd_bright_curve_en = <1>;
      
      	/* part 5 */
      	lcd_cpu_mode= <1>;
      	lcd_cpu_te= <0>;
      	lcd_frm = <1>;
      	lcd_gamma_en = <0>;
      	lcd_cmap_en = <0>;
      
      	/* part 6 */
      	lcd_gpio_0 = <&pio PD 0 GPIO_ACTIVE_LOW>;
      	pinctrl-0 = <&cpu16_pins_a>;
      	pinctrl-1 = <&cpu16_pins_b>;
      };
      

      驱动

      /* 
       * Copyright (c) 2021 Allwinnertech Co., Ltd.
       *
       *
       * This program is free software; you can redistribute it and/or modify
       * it under the terms of the GNU General Public License version 2 as
       * published by the Free Software Foundation.
      */
      #include "st7789v_cpu2.h"
      static void lcd_power_on(u32 sel);
      static void lcd_power_off(u32 sel);
      static void lcd_bl_open(u32 sel);
      static void lcd_bl_close(u32 sel);
      
      static void lcd_panel_init(u32 sel);
      static void lcd_panel_exit(u32 sel);
      
      #define panel_reset(sel, val) sunxi_lcd_gpio_set_value(sel, 0, val)
      
      static void lcd_cfg_panel_info(struct panel_extend_para *info)
      {
      	u32 i = 0, j = 0;
      	u32 items;
      	u8 lcd_gamma_tbl[][2] = {
      		{0, 0},
      		{15, 15},
      		{30, 30},
      		{45, 45},
      		{60, 60},
      		{75, 75},
      		{90, 90},
      		{105, 105},
      		{120, 120},
      		{135, 135},
      		{150, 150},
      		{165, 165},
      		{180, 180},
      		{195, 195},
      		{210, 210},
      		{225, 225},
      		{240, 240},
      		{255, 255},
      	};
      
      	u32 lcd_cmap_tbl[2][3][4] = {
      		{
      			{LCD_CMAP_G0, LCD_CMAP_B1, LCD_CMAP_G2, LCD_CMAP_B3},
      			{LCD_CMAP_B0, LCD_CMAP_R1, LCD_CMAP_B2, LCD_CMAP_R3},
      			{LCD_CMAP_R0, LCD_CMAP_G1, LCD_CMAP_R2, LCD_CMAP_G3},
      		},
      		{
      			{LCD_CMAP_B3, LCD_CMAP_G2, LCD_CMAP_B1, LCD_CMAP_G0},
      			{LCD_CMAP_R3, LCD_CMAP_B2, LCD_CMAP_R1, LCD_CMAP_B0},
      			{LCD_CMAP_G3, LCD_CMAP_R2, LCD_CMAP_G1, LCD_CMAP_R0},
      		},
      	};
      
      	items = sizeof(lcd_gamma_tbl) / 2;
      	for (i = 0; i < items - 1; i++) {
      		u32 num = lcd_gamma_tbl[i + 1][0] - lcd_gamma_tbl[i][0];
      
      		for (j = 0; j < num; j++) {
      			u32 value = 0;
      
      			value = lcd_gamma_tbl[i][1] +
      				((lcd_gamma_tbl[i + 1][1] - lcd_gamma_tbl[i][1])
      				 * j) / num;
      			info->lcd_gamma_tbl[lcd_gamma_tbl[i][0] + j] =
      				(value << 16)
      				+ (value << 8) + value;
      		}
      	}
      	info->lcd_gamma_tbl[255] = (lcd_gamma_tbl[items - 1][1] << 16) +
      				   (lcd_gamma_tbl[items - 1][1] << 8)
      				   + lcd_gamma_tbl[items - 1][1];
      
      	memcpy(info->lcd_cmap_tbl, lcd_cmap_tbl, sizeof(lcd_cmap_tbl));
      
      }
      
      static s32 lcd_open_flow(u32 sel)
      {
      	LCD_OPEN_FUNC(sel, lcd_power_on, 10);
      	LCD_OPEN_FUNC(sel, lcd_panel_init, 10);
      	LCD_OPEN_FUNC(sel, sunxi_lcd_tcon_enable, 50);
      	LCD_OPEN_FUNC(sel, lcd_bl_open, 0);
      
      	return 0;
      }
      
      static s32 lcd_close_flow(u32 sel)
      {
      	LCD_CLOSE_FUNC(sel, lcd_bl_close, 0);
      	LCD_CLOSE_FUNC(sel, sunxi_lcd_tcon_disable, 0);
      	LCD_CLOSE_FUNC(sel, lcd_panel_exit, 200);
      	LCD_CLOSE_FUNC(sel, lcd_power_off, 500);
      
      	return 0;
      }
      
      static void lcd_power_on(u32 sel)
      {
      	panel_reset(sel, 1);
      	sunxi_lcd_delay_ms(100);
      	panel_reset(sel, 0);
      	sunxi_lcd_delay_ms(20);
      	panel_reset(sel, 1);
      	sunxi_lcd_delay_ms(100);
      	sunxi_lcd_pin_cfg(sel, 1);
      
      }
      
      static void lcd_power_off(u32 sel)
      {
      	sunxi_lcd_pin_cfg(sel, 0);
      	sunxi_lcd_delay_ms(20);
      	panel_reset(sel, 0);
      	sunxi_lcd_delay_ms(5);
      }
      
      static void lcd_bl_open(u32 sel)
      {
      	sunxi_lcd_pwm_enable(sel);
      }
      
      static void lcd_bl_close(u32 sel)
      {
      	sunxi_lcd_pwm_disable(sel);
      }
      
      
      static void lcd_panel_init(u32 sel)
      {
      	sunxi_lcd_cpu_write_index(sel, 0xbb);
      	sunxi_lcd_cpu_write_data(sel, 0x1e);
      	sunxi_lcd_cpu_write_index(sel, 0xc0);
      	sunxi_lcd_cpu_write_data(sel, 0x2c);
      	sunxi_lcd_cpu_write_index(sel, 0xc2);
      	sunxi_lcd_cpu_write_data(sel, 0x01);
      
      	sunxi_lcd_cpu_write_index(sel, 0xc3);
      	sunxi_lcd_cpu_write_data(sel, 0x0b);
      	sunxi_lcd_cpu_write_index(sel, 0xc4);
      	sunxi_lcd_cpu_write_data(sel, 0x20);
      
      	//sunxi_lcd_cpu_write_index(sel, 0xc6);// frame rate control
      	//sunxi_lcd_cpu_write_data(sel, 0x04);
      
      	sunxi_lcd_cpu_write_index(sel, 0xd0);
      	sunxi_lcd_cpu_write_data(sel, 0xa4);
      	sunxi_lcd_cpu_write_data(sel, 0xa1);
      	sunxi_lcd_cpu_write_index(sel, 0xd6);
      	sunxi_lcd_cpu_write_data(sel, 0xa1);
      	sunxi_lcd_cpu_write_index(sel, 0xbb);
      	sunxi_lcd_cpu_write_data(sel, 0x1a);
      #endif
      	/*ST7789V gamma setting */
      
      	sunxi_lcd_cpu_write_index(sel, 0xe0);
      	sunxi_lcd_cpu_write_data(sel, 0xd0);
      	sunxi_lcd_cpu_write_data(sel, 0x06);
      	sunxi_lcd_cpu_write_data(sel, 0x0b);
      	sunxi_lcd_cpu_write_data(sel, 0x07);
      	sunxi_lcd_cpu_write_data(sel, 0x07);
      	sunxi_lcd_cpu_write_data(sel, 0x24);
      	sunxi_lcd_cpu_write_data(sel, 0x2e);
      	sunxi_lcd_cpu_write_data(sel, 0x32);
      	sunxi_lcd_cpu_write_data(sel, 0x46);
      	sunxi_lcd_cpu_write_data(sel, 0x37);
      	sunxi_lcd_cpu_write_data(sel, 0x13);
      	sunxi_lcd_cpu_write_data(sel, 0x13);
      	sunxi_lcd_cpu_write_data(sel, 0x2d);
      	sunxi_lcd_cpu_write_data(sel, 0x33);
      
      	sunxi_lcd_cpu_write_index(sel, 0xe1);
      	sunxi_lcd_cpu_write_data(sel, 0xd0);
      	sunxi_lcd_cpu_write_data(sel, 0x02);
      	sunxi_lcd_cpu_write_data(sel, 0x06);
      	sunxi_lcd_cpu_write_data(sel, 0x09);
      	sunxi_lcd_cpu_write_data(sel, 0x08);
      	sunxi_lcd_cpu_write_data(sel, 0x05);
      	sunxi_lcd_cpu_write_data(sel, 0x29);
      	sunxi_lcd_cpu_write_data(sel, 0x44);
      	sunxi_lcd_cpu_write_data(sel, 0x42);
      	sunxi_lcd_cpu_write_data(sel, 0x38);
      	sunxi_lcd_cpu_write_data(sel, 0x14);
      	sunxi_lcd_cpu_write_data(sel, 0x14);
      	sunxi_lcd_cpu_write_data(sel, 0x2a);
      	sunxi_lcd_cpu_write_data(sel, 0x30);
      
      	sunxi_lcd_cpu_write_index(sel, 0x21);
      	sunxi_lcd_cpu_write_index(sel, 0x11);//sleep out 
      	sunxi_lcd_delay_ms(120);
      	
      	sunxi_lcd_cpu_write_index(sel, 0x36);//data access control
      	sunxi_lcd_cpu_write_data(sel, 0xb0);
      
      	sunxi_lcd_cpu_write_index(sel, 0x2a);// column address set
      	sunxi_lcd_cpu_write_data(sel, 0x00);
      	sunxi_lcd_cpu_write_data(sel, 0x00);
      	sunxi_lcd_cpu_write_data(sel, 0x01);
      	sunxi_lcd_cpu_write_data(sel, 0x3f);
      	
      	sunxi_lcd_cpu_write_index(sel, 0x2b);// row address set
      	sunxi_lcd_cpu_write_data(sel, 0x00);
      	sunxi_lcd_cpu_write_data(sel, 0x00);
      	sunxi_lcd_cpu_write_data(sel, 0x00);
      	sunxi_lcd_cpu_write_data(sel, 0xef); 
      
      	sunxi_lcd_cpu_write_index(sel, 0x3a);// cpu mode
      	sunxi_lcd_cpu_write_data(sel, 0x55);
      	sunxi_lcd_cpu_write_index(sel, 0x29);//display on
      	sunxi_lcd_cpu_write_index(sel, 0x2c);//memory write
      	printk(KERN_ERR "st7789v3 init over!");
      }
      
      static void lcd_panel_exit(u32 sel)
      {
      	//sunxi_lcd_dsi_dcs_write_0para(sel, 0x10);
      	sunxi_lcd_delay_ms(80);
      	//sunxi_lcd_dsi_dcs_write_0para(sel, 0x28);
      	sunxi_lcd_delay_ms(50);
      }
      
      /*sel: 0:lcd0; 1:lcd1*/
      static s32 lcd_user_defined_func(u32 sel, u32 para1, u32 para2, u32 para3)
      {
      	return 0;
      }
      
      struct __lcd_panel st7789v_cpu2_panel = {
      	/* panel driver name, must mach the name of
      	 * lcd_drv_name in sys_config.fex
      	 */
      	.name = "st7789v_cpu2",
      	.func = {
      		.cfg_panel_info = lcd_cfg_panel_info,
      		.cfg_open_flow = lcd_open_flow,
      		.cfg_close_flow = lcd_close_flow,
      		.lcd_user_defined_func = lcd_user_defined_func,
      	},
      };
      
      
      发布在 MR Series
      A
      awwwwa
    • 回复: V853s如何实现UI图层和视频图层同时用

      参考libuapi,tplayerdemo,将UI和视频放置于不同图层即可

      发布在 V Series
      A
      awwwwa
    • 回复: D1 用Xfel启动不了内核

      @geniusz 这与Tina没有什么关系,boot.img 是一个vfat格式的镜像,你需要载入镜像读取其中的 Image.gz 载入45000000,而不是一整个载入到内存中

      boot.img 是安卓格式的 Linux 内核文件,格式如下

      typedef struct boot_img_hdr boot_img_hdr;
      
      #define BOOT_MAGIC "Android!"
      #define BOOT_MAGIC_SIZE 8
      #define BOOT_NAME_SIZE 16
      #define BOOT_ARGS_SIZE 512
      
      struct boot_img_hdr
      {
          unsigned char magic[BOOT_MAGIC_SIZE];
      
          unsigned kernel_size;  /* size in bytes */
          unsigned kernel_addr;  /* physical load addr */
      
          unsigned ramdisk_size; /* size in bytes */
          unsigned ramdisk_addr; /* physical load addr */
      
          unsigned second_size;  /* size in bytes */
          unsigned second_addr;  /* physical load addr */
      
          unsigned tags_addr;    /* physical addr for kernel tags */
          unsigned page_size;    /* flash page size we assume */
          unsigned dt_size;      /* device tree in bytes */
          unsigned unused;       /* future expansion: should be 0 */
          unsigned char name[BOOT_NAME_SIZE]; /* asciiz product name */
      
          unsigned char cmdline[BOOT_ARGS_SIZE];
      
          unsigned id[8]; /* timestamp / checksum / sha1 / etc */
      };
      
      boot,img文件跳过2k的文件头之后,包括两个 gz包,一个是boot.img-kernel.gz:Linux内核,一个是boot.img-ramdisk.cpio.gz
      大概的组成结构如下:
      
      ** +-----------------+ 
      ** | boot header     | 1 page
      ** +-----------------+
      ** | kernel          | n pages  
      ** +-----------------+
      ** | ramdisk         | m pages  
      ** +-----------------+
      ** | second stage    | o pages
      ** +-----------------+
      ** | device tree     | p pages
      ** +-----------------+
      ** n = (kernel_size + page_size - 1) / page_size
      ** m = (ramdisk_size + page_size - 1) / page_size
      ** o = (second_size + page_size - 1) / page_size
      ** p = (dt_size + page_size - 1) / page_size
      

      boot.img包括boot.img header、kernel以及ramdisk文件系统,并不是单纯的 Kernel 文件。当然无法启动。

      你需要做的是将 kernel 编译目录下的 Image.gz/vmlinux这样类似的kernel载入才可启动。

      发布在 MR Series
      A
      awwwwa
    • 回复: uvc例子编译出错

      检查一下是否有多次引用的库

      发布在 V Series
      A
      awwwwa
    • 回复: adb找不到设备

      目前板子处于烧录下载模式,显示 USB Device (VID_xxxx_PID_xxxx),需要进入系统后才是adb模式,显示 Tina ADB

      发布在 MR Series
      A
      awwwwa
    • 回复: 启动到这里停止了,是不是dram坏了?

      @dort91011 请问使用的固件是哪一份

      发布在 MR Series
      A
      awwwwa
    • 回复: 启动到这里停止了,是不是dram坏了?

      是什么板子呢 ?
      如果是nezha 2GB的板子请更换固件,看你的 BOOT commit 还是 20220228的版本太老了,早期固件可能不支持2G内存的板子

      发布在 MR Series
      A
      awwwwa
    • 回复: 【水经验混下载权限专用贴】如何升级LV2拉取SDK

      @willok 发表一个回复就是LV2了

      发布在 灌水区
      A
      awwwwa
    • 回复: 麻雀T113-s3, 修改boot大小后,烧录TF报告异常

      @gonboy
      修改cardscript.fex 将起始扇区改大

      发布在 其它全志芯片讨论区
      A
      awwwwa
    • 回复: R128驱动SD卡失败

      可以尝试打入这个补丁

      diff --git a/hal/source/sdmmc/_sdhost.h b/hal/source/sdmmc/_sdhost.h
      index ef910bd..b570026 100644
      --- a/hal/source/sdmmc/_sdhost.h
      +++ b/hal/source/sdmmc/_sdhost.h
      @@ -404,6 +404,9 @@
       #define SDXC_REG_DAT1_CRC               (0x12C)
       #define SDXC_REG_DAT0_CRC               (0x130)
       #define SDXC_REG_CRC_STA                (0x134)
      +#define SDXC_REG_DRV_DL                 (0x140)
      +#define SDXC_REG_SAMP_DL                (0x144)
      +#define SDXC_REG_DS_DL                  (0x148)
       #define SDXC_REG_FIFO                   (0x200) /* SMC FIFO Access Address */
       
       #define SDXC_REG_FCTL                   (0x64)      /* SMC FIFO Access Address */
      diff --git a/hal/source/sdmmc/hal_sdhost.c b/hal/source/sdmmc/hal_sdhost.c
      index dedf897..e47b3da 100644
      --- a/hal/source/sdmmc/hal_sdhost.c
      +++ b/hal/source/sdmmc/hal_sdhost.c
      @@ -1017,6 +1017,7 @@
       	uint32_t rval;
       	uint32_t src = 0;
       	uint32_t m, n;
      +	uint32_t clk_2x;
       
       	if (cclk > DEFINE_SYS_CRYSTAL/2) {
       #ifdef NUSE_STANDARD_INTERFACE
      @@ -1033,8 +1034,8 @@
       #endif
       		sclk = DEFINE_SYS_CRYSTAL;
       	}
      -	cclk = cclk * 2; /* 2x MODE clock configure */
      -	div = (2 * sclk + cclk) / (2 * cclk);
      +	clk_2x = cclk * 2; /* 2x MODE clock configure */
      +	div = (2 * sclk + clk_2x) / (2 * clk_2x);
       	div = div == 0 ? 1 : div;
       	if (div > 128) {
       		n = 3;
      @@ -1142,6 +1143,37 @@
       	mci_writel(rval, host, SDXC_REG_CLKCR);
       	sdc_hex_dump_word((void *)SDC_CCM_BASE  ,0x900);
       
      +#ifdef CONFIG_ARCH_SUN20IW2
      +#define CFGDLY          (0x3F<<0)
      +#define ENABLEDLY       (1<<7)
      +	uint32_t samclk_pha = 0;
      +
      +	if (cclk <= 50000000) {
      +		samclk_pha = 6;//6; //63
      +	} else if (cclk <= 100000000) {
      +		samclk_pha = 21;
      +	} else if (cclk <= 150000000) {
      +		samclk_pha = 24;//11;//23;3-24
      +	} else if (cclk <= 200000000) {
      +		samclk_pha = 24;//6;//15;//33;
      +	}
      +	rval = mci_readl(host, SDXC_REG_NTSR);
      +	rval &= ~(0x1<<31); // old timming mode
      +	mci_writel(rval, host, SDXC_REG_NTSR);
      +
      +	rval = mci_readl(host, SDXC_REG_SAMP_DL);
      +	rval &= ~CFGDLY;
      +	rval |= ENABLEDLY | samclk_pha;
      +	mci_writel(rval, host, SDXC_REG_SAMP_DL);
      +
      +	rval = mci_readl(host, SDXC_REG_DS_DL);
      +	rval &= ~CFGDLY;
      +	rval |= ENABLEDLY | samclk_pha;
      +	mci_writel(rval, host, SDXC_REG_DS_DL);
      +
      +	mci_writel(0x0, host, SDXC_REG_DRV_DL);
      +#endif
      +
       	return cclk;
       }
       
      @@ -1949,11 +1981,6 @@
       	mci_writel(rval, host, SDXC_REG_GCTRL);
       #endif
       
      -#ifdef CONFIG_ARCH_SUN20IW2
      -	mci_writel(mci_readl(host, SDXC_REG_NTSR) | 0x110, host, SDXC_REG_NTSR);
      -	mci_writel(0x00030000, host, 0x140);
      -#endif
      -
       	if (host->sdc_id == 0) {
       		SDC_ENABLE_IRQ(SDC0_IRQn);
       	}
      diff --git a/hal/source/sdmmc/sd.c b/hal/source/sdmmc/sd.c
      index f569730..957250d 100644
      --- a/hal/source/sdmmc/sd.c
      +++ b/hal/source/sdmmc/sd.c
      @@ -732,6 +732,24 @@
       	return err;
       }
       
      +static int32_t mmc_sd_switch_hs_mode(struct mmc_card *card)
      +{
      +	uint32_t status[64/sizeof(uint32_t)] = {0};
      +	int32_t err;
      +	uint32_t timing = 0;
      +	uint8_t *p_sta = (uint8_t *)status;
      +
      +	err = mmc_sd_switch(card, SD_SWITCH_SET, SD_SWITCH_GRP_ACCESS_MODE, card->sd_bus_speed, p_sta);
      +	if (err)
      +		return err;
      +
      +	if ((p_sta[16] & 0xF) != card->sd_bus_speed) {
      +		SD_LOGW("%s: Problem setting bus speed mode!\n", __func__);
      +	}
      +
      +	return 0;
      +}
      +
       /*
        * Test if the card supports high-speed mode and, if so, switch to it.
        */
      @@ -993,9 +1011,12 @@
       			if (err)
       				return -1;
       		} else {
      -			mmc_card_set_highspeed(card);
       			card->sd_bus_speed = HIGH_SPEED_BUS_SPEED;
      -
      +			err = mmc_sd_switch_hs_mode(card);
      +			if (err) {
      +				SD_LOGW("switch to high speed error, use DS: 25 MHz\n");
      +			}
      +			mmc_card_set_highspeed(card);
       			clk = mmc_sd_get_max_clock(card);
       			err = HAL_SDC_Update_Clk(card->host, clk);
       			if (err)
      
      
      发布在 A Series
      A
      awwwwa
    • 回复: R128驱动SD卡失败

      正常挂载log

      card_detect removed sdmmc_test->card_id=0
      [WRN] SDC:sdc:0000000008280E50 no medium present
      SDC:Not imp HAL_SDC_PowerOff,2028
      SDC:Not implement __mci_hold_io,823
      SD:mmc_card_delete card:00000000081A3370 id:0
      card_detect insert sdmmc_test->card_id=0
      card id is 0
      SD:mmc_card_create card:00000000081A3370 id:0
      card debug mask 3c
      SDC:Not implement __mci_restore_io,838
      HAL_GetHFClock,53 Warning Use fix value 24000000
      HAL_GetHFClock,53 Warning Use fix value 24000000
      HAL_GetHFClock,53 Warning Use fix value 24000000
      SDC:SDC clock=416666 kHz,src:0, n:2, m:11
      HAL_GetHFClock,53 Warning Use fix value 24000000
      HAL_GetHFClock,53 Warning Use fix value 24000000
      HAL_GetHFClock,53 Warning Use fix value 24000000
      SDC:SDC clock=416666 kHz,src:0, n:2, m:11
      [ERR] SDC:__mci_irq_handler,924 raw_int:100 err!
      [ERR] SDC:SDC err, cmd 52,  RTO
      [ERR] SDC:sdc 701 abnormal status: RespErr
      [ERR] SDC:__mci_irq_handler,924 raw_int:100 err!
      [ERR] SDC:SDC err, cmd 52,  RTO
      [ERR] SDC:sdc 701 abnormal status: RespErr
      SD:***** Try sdio *****
      [ERR] SDC:__mci_irq_handler,924 raw_int:100 err!
      [ERR] SDC:SDC err, cmd 5,  RTO
      [ERR] SDC:sdc 701 abnormal status: RespErr
      SD:***** Try sd *****
      mmc_send_app_op_cond,89
      SD:card ocr: c0ff8000
      SD:Card CID number:2544d53
      SD:card raw cid:
      SD:card raw csd:
      m:29567, e:2, dtr:25000000, cl:1461, len:9, cap:30277632 str:1
      SD:card raw scr:
      SD:card raw SD status:
      HAL_GetHFClock,53 Warning Use fix value 24000000
      HAL_GetDevClock,90 Warning Use fix value 192000000
      HAL_GetDevClock,90 Warning Use fix value 192000000
      SDC:SDC clock=48000000 kHz,src:1, n:0, m:1
      SD:card is switched to high speed mode, clk:50000 KHz
      SD:Set bus width type: 2
      SD:
      ============= card information ==============
      SD:Card Type     : SDHC
      SD:Card Spec Ver : 5.0
      SD:Card RCA      : 0x1234
      SD:Card OCR      : 0x40ff8000
      SD:    vol_window  : 0x00ff8000
      SD:    to_1v8_acpt : 0
      SD:    high_capac  : 0
      SD:Card CSD      :
      SD:    speed       : 50000 KHz
      SD:    cmd class   : 0x5b5
      SD:    capacity    : 14784MB
      SD:Card CUR_STA  :
      SD:    speed_mode  : HS: 50 MHz
      SD:    bus_width   : 2
      SD:    speed_class : 10
      SD:=============================================
      SD:***** sd init ok *****
      Initial card success
      mount successully
      
      发布在 A Series
      A
      awwwwa
    • 回复: R128驱动SD卡失败

      硬件是怎么接入的呢?

      发布在 A Series
      A
      awwwwa
    • 回复: 麻雀T113-s3(mq-r 双核), 调试端口uart0修改未uart3(PB6/PB7) 后,无法显示/dev/ttySn. 并且无法通过串口调试

      内核配置没开启字符设备

      发布在 其它全志芯片讨论区
      A
      awwwwa
    • 回复: 全志在线开源芯片 新 SDK 平台下载方法汇总

      @huang825172 可能目前网络不太好,稍等一下再拉取就行

      发布在 代码下载问题专区
      A
      awwwwa
    • 回复: 使用docker环境arm交叉编译OpenCV出错

      libopencv_highgui.so.4.8.0: file not recognized: File format not recognized

      opencv不是交叉编译的

      发布在 其它全志芯片讨论区
      A
      awwwwa
    • 回复: V851s 设备添加了开机logo后提示can't find partition bootloader,并且无法显示开机logo

      @newcastle 在 V851s 设备添加了开机logo后提示can't find partition bootloader,并且无法显示开机logo 中说:

      ** Unable to read file bootlogo.bmp **

      找不到文件,bootlogo应该是在boot-resource里不在bootloader分区

      发布在 V Series
      A
      awwwwa
    • 回复: 请教全志方案ota包有办法转成线刷包吗

      @dort91011 ota包仅包含部分文件,缺失一些必要文件,不可以转换

      发布在 编译和烧写问题专区
      A
      awwwwa
    • 回复: 按照官方文档去配置spinand切换spinor报错

      @abcdef 没有挂载上spi nor,也没有识别到,建议检查设备树配置是否正确

      发布在 MR Series
      A
      awwwwa
    • 回复: ubuntu 18编译 R818 TinaSDK 2.0 ROS包,提示 host python 错误,有遇到过的同学么?

      试试使用Ubuntu 14.04

      发布在 其它全志芯片讨论区
      A
      awwwwa
    • 回复: 请问谁有AIC600E3的DRAM初始化代码?

      @lvjun0728 主线(u-boot)不支持AIC600E3的DRAM初始化,请向ArtInChip联系获得支持。

      由于AIC600E3修改了 DRAM 的 pinmux 线序,如没有原厂支持测试这个mux需要尝试20w次以上

      发布在 其它全志芯片讨论区
      A
      awwwwa
    • 回复: Tina编译库依赖问题

      @xiaye

      单个包:

      define Package/程序包名/extra_provides
          echo 'libz.so';
      endef
      

      多个包:

      define Package/程序包名/extra_provides
          echo 'libstdc++.so.6'; \
          echo 'libm.so.6'; \
          echo 'libc.so.6'; \
          echo 'libz.so';
      endef
      
      发布在 Linux
      A
      awwwwa
    • 回复: 麻雀 MQ-Dual (双核A7版本内置128M运存) ,准备测试

      @gonboy 换这个帖子里的驱动,芒果仓库里的摄像头驱动用不了的

      D1-H (MQ-Pro)驱动 OV5640 摄像头
      https://bbs.aw-ol.com/topic/4017/share/1

      发布在 其它全志芯片讨论区
      A
      awwwwa
    • 回复: mCore R818使用genimage 打包镜像通过dd if烧录 提示如下错误!

      sunxi_gpt 可以这样生成

      update_mbr sys_partition.bin 4 sunxi_mbr.fex dlinfo.fex 15269888 40960 0 
      
      sys_partition.bin----分区表的2进制文件
      4----------------------分区表的备份个数,一般spinor为1,其他为4
      sunxi_mbr.fex------生成mbr格式分区表的文件
      dlinfo.fex-----------下载文件信息表
      15269888----------该flash的大小,比如EMMC的USR分区的大小,单位为sector
      20------------------该flash的逻辑地址,单位MByte
      0--------------------代表flash的类型,1是spinor flash,0是非 spi nor类型
      发布在 其它全志芯片讨论区
      A
      awwwwa
    • 回复: mCore R818使用genimage 打包镜像通过dd if烧录 提示如下错误!

      可以尝试使用 programmer_img 生成固件

      使用方法

      programmer_img boot0_sdcard.fex boot_package.fex ${out_img}
      
      boot0_sdcard.fex----boot0文件
      boot_package.fex------即uboot文件
      ${out_img}------为生成的镜像文件
      

      或者

      programmer_img sys_partition.bin sunxi_mbr.fex ${out_img} ${in_img} sunxi_gpt.fex
      
      sys_partition.bin----分区表的脚本文件
      sunxi_mbr.fex------为mbr格式的分区表文件
      ${out_img}------为输入的镜像文件
      ${in_img}-----为输出的镜像文件
      sunxi_gpt.fex----为gpt 格式的分区表文件
      
      发布在 其它全志芯片讨论区
      A
      awwwwa
    • 回复: V853 的 CPU1(E907)启动流程

      参考Linux端代码即可,本质上为:

      1. 加载固件
        1. 调用 firmware 接口获取文件系统中的固件
        2. 解析固件的 resource_table 段,该段有如下内容
          1. 声明需要的内存(Linux 为其分配)
          2. 声明使用的 vdev(固定为一个)
          3. 声明使用的 vring(固定为两个)
        3. 将固件加载到指定地址
      2. 注册 rpmsg virtio 设备
        1. 提供 vdev->ops(基于 virtio 接口实现的)
        2. 与 rpmsg_bus 驱动匹配,完成 rpmsg 初始化
      3. 启动小核
        1. 调用 rproc->ops->start
      发布在 RTOS
      A
      awwwwa
    • 回复: camera获取图片效果问题

      @h2631436132 open版本sdk没有awispapi,需要编译mpp使用

      参考:
      v851s MPP 模块概述以及编译 sample 步骤
      https://bbs.aw-ol.com/topic/3286/share/1

      发布在 V Series
      A
      awwwwa
    • 回复: uart寄存器问题

      文档上面已经说清楚了

      43cf9159-09a0-4931-a81c-69817d87c51a-image.png

      发布在 MR Series
      A
      awwwwa
    • 回复: camera获取图片效果问题

      @h2631436132 这个需要调试ISP,加入3A算法支持

      发布在 V Series
      A
      awwwwa
    • 回复: t113-s3安装XR829模块卡死

      卡死说明CPU进入异常情况且不能trap,似乎是MMC通讯的问题,请问板子是自己做的吗?各组供电正常吗。特别是3v3这一路。

      发布在 Wireless & Analog Series
      A
      awwwwa
    • 回复: V853无法烧写SPI Nand

      @haaland

      [05.750]sunxi-spinand-phy: read id failed : -110
      try nand fail
      

      nand找不到,确认一下sys_config.fex的spi引脚配置对不对

      发布在 V Series
      A
      awwwwa
    • 回复: camera获取图片效果问题

      camerademo 抓取的图片是raw原图,不经过ISP调色,如果需要ISP需要勾选 camerademo + vin isp

      发布在 V Series
      A
      awwwwa
    • D1-H 屏幕显示分屏

      69bbe42e-c58e-4a40-8e1c-1d13ccfb97be-BEL@(F4_XW0MY(@3MOJA29M.jpg

      发布在 MR Series
      A
      awwwwa
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 6 / 6