嵌入式系统开发过程中,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;
}