sd卡U盘异常检测程序

嵌入式系统开发过程中,SD卡是比较常见的外设,SD卡的稳定性与整个嵌入式系统的稳定息息相关,除了相应的驱动,还应有完整的异常检测机制。

异常检测demo(包含SD卡和U盘的检测):

#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <fcntl.h>
#include <sys/time.h>

//cw_mark
#define STORAGE_UDISK 0
#if 0
#include "MenuPicCfg.h"
#include "srv_menu_arm.h"
#include "misc.h"
#endif

// ASSUMING BOTH ARE DEFINED
#define ZHE_DCT360V3_nHARDCODE_DIR
#define ZHE_SUPPORT_MMC_STORAGE

#ifdef ZHE_EXT_UDISK_DEV_NAME
  #define NUM_DISK_ID (26*10)
  #define DISK_ID_START 1
#else
  #define NUM_DISK_ID    26
#endif

#define DISK_ID_START1 1
#define DISK_ID_START2 31
#define NUM_MMCDISK_ID 5

// State machine
// diskStatus: 
#define UDISK_UCONN_UFSCHK 0
#define UDISK_CONN_UFSCHK 1
#define UDISK_CONN_FSCHK 2

#define PRINT_POLLUDISK_TRACE
#define PRINT_POLLUDISK_TRACE_DETAILS

// check if /dev/sda1,sdb1 or sdc1 even exist
// or /dev/mmcblkNp1
#if 0
#ifdef ZHE_BIGVERSION2
#define SCRIPT_FILE "/opt/DCT360V2/polludisk.sh"
#else
#define SCRIPT_FILE "/opt/DCT360V3/polludisk.sh"
#endif
#endif

#define DOSFSCK_NO_ERR 0
#define DOSFSCK_ERR_CORRECTED 1
#define DOSFSCK_REBOOT 2
#define DOSFSCK_ERR_UNCORRECTED 4
#define DOSFSCK_OPER_ERR 8
#define DOSFSCK_USAGE_ERR 16
#define DOSFSCK_CANCELED 32
#define DOSFSCK_LIB_ERR 128

#define DOSFSCK_RST_ERR (DOSFSCK_ERR_UNCORRECTED|DOSFSCK_OPER_ERR)


//cw_mark
#if 0
extern volatile int srvAppExit;
char videoWritePath[128];
#endif

//cw_mark
//extern void resync_videoWritePath( char *path );

volatile int uDiskNChked = 1;
int is_udisk_chked() {
  return (1-uDiskNChked);
}

volatile int diskStatus = UDISK_UCONN_UFSCHK;
volatile int currDiskId = 0;
volatile int resetUDisk = 0;

//cw_mark
#if 0
extern DCT360V2Menu *gMenuPtr;
extern MenuRuntime mrt;
extern volatile int menumode;
#endif

volatile int updateStatusPg;

void reset_udisk() {
  resetUDisk = 1;
}

#ifdef PRINT_POLLUDISK_TRACE
int udiskPrevPrtSec = -1;
#endif

int is_udisk_ok_chk(int ignoreMenu) {
#ifdef PRINT_POLLUDISK_TRACE
  int prt=0;
  int sec;
  unsigned int currSec;
  struct timeval time;

  gettimeofday(&time,NULL);
  currSec = time.tv_sec;
  if (udiskPrevPrtSec==-1) {
    prt=1;
  } else {
    sec = currSec - udiskPrevPrtSec;
    if ( sec>10 || sec<-10 ) {
      prt=1;
    }
  }
  if (prt) {
    udiskPrevPrtSec = currSec;
  }
#endif

  if ( ignoreMenu ) {
    if (diskStatus == UDISK_CONN_FSCHK && resetUDisk==0 ) {
#ifdef PRINT_POLLUDISK_TRACE
      if (prt) {
        printf("UDisk OK wo menumode check\n");
      }
#endif
      return 1;
    } else {
#ifdef PRINT_POLLUDISK_TRACE
      if (prt) {
        printf("UDisk Err wo menumode check:diskStatus=%d,resetUDisk=%d\n",
          diskStatus,resetUDisk);
      }
#endif
      return 0;
    }
  } else {

    // NOTE: in menumode, the export and import operation require sync
    // since udisk is being written, the sync will never be finished
    // that's why we don't allow write in menumode
//cw_mark
#if 0
    if (diskStatus == UDISK_CONN_FSCHK && resetUDisk==0 && menumode==0 ) {
#endif
    if (diskStatus == UDISK_CONN_FSCHK && resetUDisk==0 ) {
#ifdef PRINT_POLLUDISK_TRACE
      if (prt) {
        printf("UDisk OK\n");
      }
#endif
      return 1;
    } else {
#ifdef PRINT_POLLUDISK_TRACE
      if (prt) {
//cw_mark
#if 0
        printf("UDisk Err:diskStatus=%d,resetUDisk=%d,menumode=%d\n",
#endif
        printf("UDisk Err:diskStatus=%d,resetUDisk=%d\n",
          diskStatus,resetUDisk);
      }
#endif
      return 0;
    }
  }
}

int is_udiskfs_in_check() {
 if ( diskStatus == UDISK_CONN_UFSCHK ) {
   return 1;
 } else {
   return 0;
 }
}

int is_udisk_ok() {
  int ignoreMenu = 0;
  // must also check menu
  return is_udisk_ok_chk(ignoreMenu);
}

int is_udisk_ok_in_menu() {
  int ignoreMenu = 1;
  return is_udisk_ok_chk(ignoreMenu);  
}

// support both /dev/sda and /dev/sda1
#ifdef ZHE_EXT_UDISK_DEV_NAME
static int is_udisk_connected_udisk(char *devNameOut) {
#else
static int is_udisk_connected_udisk() {
#endif
  int fds = 0;
  int i,diskId;
  char devName[64] = "/dev/sda1";
#ifdef ZHE_EXT_UDISK_DEV_NAME
  int j, aLen;
#endif

  diskId = 0;
#ifdef ZHE_EXT_UDISK_DEV_NAME
  aLen=7;
  for (i=0;i<NUM_DISK_ID;i+=26) {
    for (j=0;j<26;j++) {
      fds = open(devName,O_RDONLY);
      if (fds<=0) {
      } else {
#ifdef PRINT_POLLUDISK_TRACE
        printf("[ARM]: poll udisk %s exists\n",devName);
#endif
        diskId = i+DISK_ID_START;
        close(fds);
        strcpy(devNameOut,devName);
        return diskId;
      }
      devName[aLen]++;
    }
    devName[aLen]='a';
    aLen++;
    devName[aLen]='a'; devName[aLen+1]='1'; devName[aLen+2]=0;
  }
#else 
  for (i=0;i<NUM_DISK_ID;i++) {
    fds = open(devName,O_RDONLY);
    if (fds<=0) {
    } else {
      //printf("%s exists\n",devName);
      diskId = i+DISK_ID_START1;
      close(fds);
      break;
    }
    devName[7]++;
  }
#endif

  if ( diskId != 0 )
    return diskId;

  // now check /dev/sda
  strcpy(devName,"/dev/sda");
  diskId = 0;
#ifdef ZHE_EXT_UDISK_DEV_NAME
  aLen=7;
  for (i=0;i<NUM_DISK_ID;i+=26) {
    for (j=0;j<26;j++) {
      fds = open(devName,O_RDONLY);
      if (fds<=0) {
      } else {
#ifdef PRINT_POLLUDISK_TRACE
        printf("[ARM]: poll udisk %s exists\n",devName);
#endif
        diskId = (i+DISK_ID_START)|0x08000000 ;
        close(fds);
        strcpy(devNameOut,devName);
        return diskId;
      }
      devName[aLen]++;
    }
    devName[aLen]='a';
    aLen++;
    devName[aLen]='a'; devName[aLen+1]=0;
  }
#else 
  for (i=0;i<NUM_DISK_ID;i++) {
    fds = open(devName,O_RDONLY);
    if (fds<=0) {
    } else {
      //printf("%s exists\n",devName);
      diskId = i+DISK_ID_START2;
      close(fds);
      break;
    }
    devName[7]++;
  }
#endif

  return diskId;
}

// support both /dev/sda and /dev/sda1
static int is_udisk_connected_mmc() {
  int fds = 0;
  int i,diskId;
  char devName[32] = "/dev/mmcblk0p1";

  diskId = 0;
  for (i=0;i<NUM_MMCDISK_ID;i++) {
    //printf("=====open %s...\n",devName);
    fds = open(devName,O_RDONLY);
    if (fds<=0) {
    } else {
      diskId = i+DISK_ID_START1;
      close(fds);
      break;
    }
    devName[11]++;
  }
  
  if ( diskId != 0 ) {
    //printf("=====find mmc%d...\n",diskId);
    return diskId;
  }

  // now check /dev/mmcblk0
  strcpy(devName,"/dev/mmcblk0");
  diskId = 0;
  for (i=0;i<NUM_MMCDISK_ID;i++) {
    //printf("=====open %s...\n",devName);
    fds = open(devName,O_RDONLY);
    if (fds<=0) {
    } else {
      diskId = i+DISK_ID_START2;
      close(fds);
      //printf("=====find mmc%d...\n",diskId);
      break;
    }
    devName[11]++;
  }

  return diskId;
}

//cw_mark
static volatile int storePath=STORAGE_UDISK;
int is_storage_path_udisk() {
  if ( storePath==STORAGE_UDISK) {
    return 1;
  } else {
    return 0;
  }
}

#ifdef ZHE_EXT_UDISK_DEV_NAME
int is_udisk_connected(char *devName) {
#else
int is_udisk_connected() {
#endif
  if ( is_storage_path_udisk() ) {
#ifdef ZHE_EXT_UDISK_DEV_NAME
    return is_udisk_connected_udisk(devName);
#else
    return is_udisk_connected_udisk();
#endif
  } else {
    return is_udisk_connected_mmc();
  }
}

// Explanation:
/*
  if ( resetUDisk || is_udisk_connected()==0 ) {
    write "NG" to /media/ram/udiskerr.txt
    return -1
  }

  // maybe resource busy?
  umount /media/sda1

  rstWrong=1;
  fixTime=0;
  while( fixTime<10 && rstWrong==1 ) {
    if ( resetUDisk ) {
      write "NG" to /media/ram/udiskerr.txt
      return -1      
    }

    execute dosfsck cmd
    if (cmd return success) {
      rstWrong=0; // should break out of loop
    } else {
      fixTime++;
    }
  }

  if (rstWrong) {
    write "NG" to /media/ram/udiskerr.txt
    return -1
  } else {
    mount udisk to /media/sda1
    set currDiskId
    remove *.REC
    return 0
  }
*/

static int check_udisk_fs_udisk() {
  int fixTime=1;
  char diskPath[128];
  char rstPath[] = "/media/ram/fsckrst.txt";
  char cmd[128];
  char str[] = "Free cluster summary wrong";
  int i, len, rstWrong=1;
  FILE *fp;
  int diskId=0;
  int rtCode;
#ifdef ZHE_EXT_UDISK_DEV_NAME
  char devName[64];
#endif

  //cw_mark
  char UDISK_DIR[32] = {"/media/sda1"};

  fixTime = 10; 

  if ( resetUDisk ) {
    rstWrong = 1;
    goto output_rst;
  }
  
  // first lets poll if /dev/sda1 sdb1 or sdc1 exist
#ifdef ZHE_EXT_UDISK_DEV_NAME
  diskId = is_udisk_connected(devName);
#else
  diskId = is_udisk_connected();
#endif
  if (diskId==0) {
    printf("@@@@check_udisk_fs: Disk not exist when checking fs\n");
    goto output_rst;
  }

#ifdef ZHE_EXT_UDISK_DEV_NAME
  strcpy(diskPath,devName);
  strcpy(cmd,"umount /media/sda1");
#else
  if (diskId>=DISK_ID_START1 && diskId<(DISK_ID_START1+NUM_DISK_ID) ) {
    strcpy(diskPath,"/dev/sda1");
    diskPath[7] = 'a'+(diskId-DISK_ID_START1);
    sprintf(cmd,"umount %s",UDISK_DIR); // /media/sda1
  } else if (diskId>=DISK_ID_START2 && diskId<(DISK_ID_START2+NUM_DISK_ID) ) {
    strcpy(diskPath,"/dev/sda");
    diskPath[7] = 'a'+(diskId-DISK_ID_START2);
    sprintf(cmd,"umount %s",UDISK_DIR); // /media/sda1
  }
#endif

#ifdef PRINT_POLLUDISK_TRACE
  printf("Checking filesys on %s\n", diskPath);
#endif
  //printf("@@@@check_udisk_fs: %s\n",cmd);
  system(cmd);
  //printf("@@@@check_udisk_fs: %s done\n",cmd);

  i = 0;
  len = strlen(str) - 1;

#ifdef ZHE_DISABLE_FSCHK

  rstWrong = 0;
  
#else

  // ZHENGTING: WHAT IS THIS?
  // (i<fixTime && rstWrong==1)
  while( (i<fixTime) & rstWrong ) {
#ifdef PRINT_POLLUDISK_TRACE
    printf("checkfix %d time ...\n",i);
#endif
    if ( resetUDisk ) {
      rstWrong = 1;
      break;
    }

    // command to check filesys
    sprintf(cmd,"dosfsck -aw %s",diskPath);
    printf("@@@@check_udisk_fs: %s\n",cmd);
    system(cmd);
    
    sprintf(cmd, "echo $? > %s",rstPath);
    printf("@@@@check_udisk_fs: %s\n",cmd);
    system(cmd);    


    // open result
    fp = fopen(rstPath,"rb");
    if (!fp) {
#ifdef PRINT_POLLUDISK_TRACE
      printf("@@@@check_udisk_fs: cannot open %s\n",rstPath);
#endif
      break;
    }
    
    // check result in file
    i++;
    rstWrong = 0;
    rtCode=-1;
    fscanf(fp,"%d",&rtCode);
    if (rtCode==DOSFSCK_NO_ERR || rtCode==DOSFSCK_ERR_CORRECTED) {
      printf("@@@@check_udisk_fs: OK %d\n",rtCode);
    } else {
      printf("@@@@check_udisk_fs: NG %d\n",rtCode);
      rstWrong=1;
    }

    // close result file
    if (fp) {
      fclose(fp);
    }

  }
#endif

output_rst:
  if ( rstWrong ) {
    fp = fopen("/media/ram/udiskerr.txt","wb");
    if (fp) {
      fprintf(fp,"NG");
      fclose(fp);
    } else {
      printf("@@@@check_udisk_fs: Failed to open /media/ram/udiskerr.txt\n");
    }
#ifdef PRINT_POLLUDISK_TRACE
    printf("@@@@check_udisk_fs: UDisk filesys not fixed NG\n");
#endif

    // THIS PROBABLY SHOULD BE REMOVED
    // If there is an UFS eror, cannot remove *.REC anyway
#ifndef ZHE_DISABLE_FSCHK
    sprintf(cmd,"rm %s/FSCK*.REC",UDISK_DIR);
    printf("@@@@check_udisk_fs: %s\n",cmd);
    system(cmd);
#endif

    return -1;
  } else {
    fp = fopen("/media/ram/udiskok.txt","wb");
    if (fp) {
      fprintf(fp,"OK");
      fclose(fp);
    } else {
      printf("@@@@check_udisk_fs: Failed to open /media/ram/udiskok.txt\n");
    }
#ifdef PRINT_POLLUDISK_TRACE
    printf("@@@@check_udisk_fs: UDisk filesys fixed\n");
#endif

#ifdef ZHE_EXT_UDISK_DEV_NAME
    if ( diskId!=0 ) {
      sprintf(cmd,"mount -t vfat %s /media/sda1", diskPath);
//cw_mark
      //strcpy(videoWritePath,"/media/sda1");
    }
#else
    if (diskId>=DISK_ID_START1 && diskId<(DISK_ID_START1+NUM_DISK_ID) ) {
      sprintf(cmd,"mount -t vfat /dev/sda1 %s",UDISK_DIR);
//cw_mark
      //strcpy(videoWritePath,UDISK_DIR);
      cmd[21] = 'a'+(diskId-DISK_ID_START1);
    } else if (diskId>=DISK_ID_START2 && 
               diskId<(DISK_ID_START2+NUM_DISK_ID) ) {
      sprintf(cmd,"mount -t vfat /dev/sda %s",UDISK_DIR);
//cw_mark
      //strcpy(videoWritePath,UDISK_DIR);
      cmd[21] = 'a'+(diskId-DISK_ID_START2);
    }
#endif

    printf("@@@@check_udisk_fs: %s\n",cmd);
    system(cmd);
    currDiskId = diskId;

    sprintf(cmd,"rm %s/FSCK*.REC",UDISK_DIR);
    printf("@@@@check_udisk_fs: %s\n",cmd);
    system(cmd);

    return 0;
  }
}

static int check_udisk_fs_mmc() {
  int fixTime=1;
  char diskPath[128];
  char rstPath[] = "/media/ram/fsckrst.txt";
  char cmd[128];
  char str[] = "Free cluster summary wrong";
  int i, len, rstWrong=1;
  FILE *fp;
  int diskId=0;
  int rtCode;
#ifdef ZHE_EXT_UDISK_DEV_NAME
  char dummyDevName[64];
#endif

  //cw_mark
  char UDISK_DIR[32] = {"/media/mmc1"};

  fixTime = 10; 

  if ( resetUDisk ) {
    rstWrong = 1;
    goto output_rst;
  }
  
  // first lets poll if /dev/sda1 sdb1 or sdc1 exist
#ifdef ZHE_EXT_UDISK_DEV_NAME
  diskId = is_udisk_connected(dummyDevName);
#else
  diskId = is_udisk_connected();
#endif
  if (diskId==0) {
    //printf("@@@@@@@@check_udisk_fs: Disk not exist when checking fs\n");
    goto output_rst;
  }

  if (diskId>=DISK_ID_START1 && diskId<(DISK_ID_START1+NUM_MMCDISK_ID) ) {
    strcpy(diskPath,"/dev/mmcblk0p1");
    diskPath[11] = '0'+(diskId-DISK_ID_START1);
    sprintf(cmd,"umount %s",UDISK_DIR); // /media/mmc1
  } else if (diskId>=DISK_ID_START2 && diskId<(DISK_ID_START2+NUM_MMCDISK_ID) ) {
    strcpy(diskPath,"/dev/mmcblk0");
    diskPath[11] = '0'+(diskId-DISK_ID_START2);
    sprintf(cmd,"umount %s",UDISK_DIR); // /media/mmc1
  }

#ifdef PRINT_POLLUDISK_TRACE
  printf("Checking filesys on %s\n", diskPath);
#endif
  //printf("@@@@@@@@check_udisk_fs: %s\n",cmd);
  system(cmd);
  //printf("@@@@@@@@check_udisk_fs: %s done\n",cmd);

  i = 0;
  len = strlen(str) - 1;

#ifdef ZHE_DISABLE_FSCHK

  rstWrong = 0;
  
#else

  // ZHENGTING: WHAT IS THIS?
  // (i<fixTime && rstWrong==1)
  while( (i<fixTime) & rstWrong ) {
#ifdef PRINT_POLLUDISK_TRACE
    printf("==========checkfix %d time ...\n",i);
#endif
    if ( resetUDisk ) {
      rstWrong = 1;
      break;
    }

    // command to check filesys
    sprintf(cmd,"dosfsck -aw %s",diskPath);
    printf("@@@@@@@@check_udisk_fs: %s\n",cmd);
    system(cmd);
    
    sprintf(cmd, "echo $? > %s",rstPath);
    printf("@@@@@@@@check_udisk_fs: %s\n",cmd);
    system(cmd);    


    // open result
    fp = fopen(rstPath,"rb");
    if (!fp) {
#ifdef PRINT_POLLUDISK_TRACE
      printf("@@@@@@@@check_udisk_fs: cannot open %s\n",rstPath);
#endif
      break;
    }
    
    // check result in file
    i++;
    rstWrong = 0;
    rtCode=-1;
    fscanf(fp,"%d",&rtCode);
    if (rtCode==DOSFSCK_NO_ERR || rtCode==DOSFSCK_ERR_CORRECTED) {
      printf("@@@@@@@@check_udisk_fs: OK %d\n",rtCode);
    } else {
      printf("@@@@@@@@check_udisk_fs: NG %d\n",rtCode);
      rstWrong=1;
    }

    // close result file
    if (fp) {
      fclose(fp);
    }

  }
#endif

output_rst:
  if ( rstWrong ) {
    fp = fopen("/media/ram/udiskerr.txt","wb");
    if (fp) {
      fprintf(fp,"NG");
      fclose(fp);
    } else {
      printf("@@@@@@@@check_udisk_fs: Failed to open /media/ram/udiskerr.txt\n");
    }
#ifdef PRINT_POLLUDISK_TRACE
    printf("@@@@@@@@check_udisk_fs: UDisk filesys not fixed NG\n");
#endif

    // THIS PROBABLY SHOULD BE REMOVED
    // If there is an UFS eror, cannot remove *.REC anyway
#ifndef ZHE_DISABLE_FSCHK
    sprintf(cmd,"rm %s/FSCK*.REC",UDISK_DIR);
    printf("@@@@@@@@check_udisk_fs: %s\n",cmd);
    system(cmd);
#endif

    return -1;
  } else {
    fp = fopen("/media/ram/udiskok.txt","wb");
    if (fp) {
      fprintf(fp,"OK");
      fclose(fp);
    } else {
      printf("@@@@@@@@check_udisk_fs: Failed to open /media/ram/udiskok.txt\n");
    }
#ifdef PRINT_POLLUDISK_TRACE
    printf("@@@@@@@@check_udisk_fs: UDisk filesys fixed\n");
#endif

    if (diskId>=DISK_ID_START1 && diskId<(DISK_ID_START1+NUM_MMCDISK_ID) ) {
      sprintf(cmd,"mount -t vfat /dev/mmcblk0p1 %s",UDISK_DIR);
//cw_mark
      //strcpy(videoWritePath,UDISK_DIR);
      cmd[25] = '0'+(diskId-DISK_ID_START1);
    } else if (diskId>=DISK_ID_START2 && 
               diskId<(DISK_ID_START2+NUM_MMCDISK_ID) ) {
      sprintf(cmd,"mount -t vfat /dev/mmcblk0 %s",UDISK_DIR);
//cw_mark
      //strcpy(videoWritePath,UDISK_DIR);
      cmd[25] = '0'+(diskId-DISK_ID_START2);
    }

    printf("@@@@@@@@check_udisk_fs: %s\n",cmd);
    system(cmd);
    currDiskId = diskId;

    sprintf(cmd,"rm %s/FSCK*.REC",UDISK_DIR);
    printf("@@@@@@@@check_udisk_fs: %s\n",cmd);
    system(cmd);

    return 0;
  }
}

int check_udisk_fs() {
  if ( is_storage_path_udisk() ) {
    return check_udisk_fs_udisk();
  } else {
    return check_udisk_fs_mmc();
  }
}


//cw_mark
#if 0
void* poll_udisk_func(void *param) {
#endif
int main(){
  char buf[128];
  char cmdbuf[128];
  int diskFsErr = -1;
  int diskId = 1;
#ifdef PRINT_POLLUDISK_TRACE
  int prtCnt = 0;
  int prtCntTrd = 10;
#endif
  int chkCnt = 0;
#ifdef ZHE_EXT_UDISK_DEV_NAME
  char devName[64];
#endif

#ifdef PRINT_POLLUDISK_TRACE
  printf("ZHE: srvapp_polludisk started.\n");
#endif

  while(1) {
#ifdef PRINT_POLLUDISK_TRACE
    prtCnt++;
    if (prtCnt>=prtCntTrd) {
      prtCnt=0;
    }
#endif

    //printf("======== Checking UDISK/MMC ...\n");

    if ( diskStatus == UDISK_UCONN_UFSCHK ) {
      //printf("========= current status un-connected\n");
      // do not check file write timeout since we started fixing ufs
//cw_mark
//      reset_fw_time();
#ifdef ZHE_EXT_UDISK_DEV_NAME
      diskId = is_udisk_connected(devName);
#else
      diskId = is_udisk_connected();
#endif
      resetUDisk = 0; // clear the flag
      currDiskId = diskId;
      if (diskId==0) {
        //printf("========= remain un-connected\n");
#ifdef PRINT_POLLUDISK_TRACE
        if ( prtCnt==0 ) {
          printf("UDisk: 1, unconnected\n");
        }
#endif
      } else {
        //printf("========= change to connected but not checked\n");
        diskStatus = UDISK_CONN_UFSCHK;
      } 
    }

    if ( diskStatus == UDISK_CONN_UFSCHK ) {
      //printf("========= current status connected but not checked\n");
      // connected, lets check the fs
      diskFsErr = check_udisk_fs();
      if (diskFsErr==-1) {
        currDiskId = 0;
        diskStatus = UDISK_UCONN_UFSCHK;
        //printf("========= fs error, change to unconnected status\n");
#ifdef PRINT_POLLUDISK_TRACE
        if ( prtCnt==0 ) {
          printf("UDisk: 2, connected, fs error\n");
        }
#endif
      } else {
        // currDiskId should have been set in check_udisk_fs

        // ZHE_CHKUDISK_FILEOP
        // delay a bit before allowing file op
        sleep(2);

        //printf("========= fs ok, change to connected & checked\n");
        diskStatus = UDISK_CONN_FSCHK;
//cw_mark
//        resync_videoWritePath( videoWritePath );

//cw_mark
#if 0
        if (menumode==0) { 
          //printf("========= notify to update status page due to mmc GOOD\n");
          updateStatusPg = 1;
        }
#endif

#ifdef PRINT_POLLUDISK_TRACE
        if ( prtCnt==0 ) {
          printf("UDisk: 3, connected, fs OK\n");
        }
#endif
      }
    }
 
    if ( diskStatus == UDISK_CONN_FSCHK ) {
      //printf("========= current status connected & checked\n");
#ifdef ZHE_EXT_UDISK_DEV_NAME
      diskId = is_udisk_connected(devName);
#else
      diskId = is_udisk_connected();
#endif
      if ( diskId!=currDiskId || resetUDisk ) {
        // udisk is disconnected
#ifdef PRINT_POLLUDISK_TRACE
        if ( prtCnt==0 ) {
          printf(
            "UDisk: 4, unconnected, diskId=%d,currDiskId=%d,resetUDisk=%d!\n",
            diskId,currDiskId,resetUDisk);
        }
#endif
        //printf("========= diskId=%d, change to unconnected status\n",diskId);        
        diskStatus = UDISK_UCONN_UFSCHK;

        // we might got error:
        // umount: can't umount /media/sda1: Device or resource busy
        sleep(1);
//cw_mark
        //sprintf(cmdbuf,"umount %s",videoWritePath);
        printf("%s\n",cmdbuf);
        system(cmdbuf);
//cw_mark
        //strcpy(videoWritePath,"nexist");
        printf("%s done\n",cmdbuf);
        currDiskId = 0;
//cw_mark
#if 0
        if (menumode==0) { 
          //printf("========= notify to update statusPg due to mmc loss\n");  
          updateStatusPg = 1;
        }
#endif
      } else {
        // stay connected, do nothing
        //printf("========= MMC STATE GOOD\n");
        diskStatus = UDISK_CONN_FSCHK;
#ifdef PRINT_POLLUDISK_TRACE
        if ( prtCnt==0 ) {
          printf("UDisk: 5, connected, fs OK\n");
        }
#endif
      } 
    }

    usleep(1000000);

    if (chkCnt++) {
      if (chkCnt >= 3) {
        uDiskNChked = 0;
      }
    }
  }

  printf("srvapp_polludisk exited\n");

  return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值