Beispiel #1
0
static int win_pvr_detach_proc()
{
	char rec_vol[16];
	
	if (system_state != SYS_STATE_USB_PVR)
	{
		return 0;
	}

	rec_vol[0] = 0;
	pvr_get_cur_mode(rec_vol, NULL);
	if (rec_vol[0] == 0)
	{
		DM_DEBUG("disk detach in PVR record manager, enter main menu\n");
		// Alert here:Clear all menus may cuase unpredictable result,must be tested
		api_osd_mode_change(OSD_NO_SHOW);
		ap_clear_all_menus(); //clear all menu & Hidden osd show
		menu_stack_pop_all();
		
		if(api_get_usb_unmount_flag()==0)	//-a by wangyang 2011-12-26
			image_restore_vpo_rect();
		api_set_usb_unmount_flag(0);	
		ap_clear_all_message();
		system_state = SYS_STATE_NORMAL;
		api_pvr_set_back2menu_flag(FALSE);
		ap_send_msg(CTRL_MSG_SUBTYPE_CMD_ENTER_ROOT,(UINT32)&g_win_mainmenu, FALSE);
	}
}
Beispiel #2
0
UINT32 win_disk_operate_open(UINT8 type, UINT8 *operate_result)
{

	CONTAINER* win;
	PRESULT ret = PROC_LOOP;
	UINT32 hkey;
	TEXT_FIELD* txt;
	UINT16 strID;
	MULTISEL *msel;
	char str[30];
	char rec_disk[16], tms_disk[16];

	operate_type = type;
	disk_operate_ok = 0;
		
 	txt = &disk_operate_title;
	switch(type)
	{
		case 0:
			sprintf(str, "%s", "Format");
			mode_select = 0;
			disk_format_mode_num = get_fsystem_installed(disk_mode, 8);
			if(!disk_format_mode_num)
				return 0xFF;
			break;
		case 1:
			sprintf(str, "%s", "DVR Set");
			dvr_select_type = 0;
#ifdef PVR3_SUPPORT
			dvr_type_num = 3;
#else
			dvr_type_num = 1;//3;
#endif
			break;
		case 2:
			//partition_select = 0;
			partition_num = init_valid_partition(disk_partition, 64);
			if(!partition_num)
				return 0xFF;
			if(partition_num > 2)
			{
				qsort(disk_partition, partition_num, 16, _partition_compare);
			}
			if(partition_select >= partition_num)
				partition_select = 0;
			pvr_get_cur_mode(rec_disk, tms_disk);
			//sprintf(str, "%s", (rec_disk[5] == 'h') ? "Copy: HDD to USB" : "Copy: USB to HDD");
			sprintf(str, "%s", "Copy to Other Device");
			break;
		default:
			break;
	}
	ComAscStr2Uni(str, display_strs[2]); /* set title */

	win = &g_win_disk_operate;
	OSD_SetContainerFocus(win, MENU_DISK_FORMAT);
	
	OSD_ObjOpen((POBJECT_HEAD)win, 0);
	
 	disk_operate_opened = 1;
	
	BOOL old_value = ap_enable_key_task_get_key(TRUE);
	while(ret != PROC_LEAVE)
	{
		hkey = ap_get_key_msg();
		if(hkey == INVALID_HK || hkey == INVALID_MSG)
			continue;

		ret = OSD_ObjProc((POBJECT_HEAD)win, (MSG_TYPE_KEY<<16),hkey, 0);
	}
    ap_enable_key_task_get_key(old_value);

	switch(type)
	{
		case 0:
			*operate_result = mode_select;
			break;
		case 1:
			*operate_result = dvr_select_type;
			break;
		case 2:
			*operate_result = partition_select;
			break;
		default:
			break;
	}	

	disk_operate_opened = 0;

	return disk_operate_ok;	
}
Beispiel #3
0
static void win_miscset_save_setting(void)
{
	MULTISEL	*msel;
	SYSTEM_DATA* sys_data;
	UINT32 val;

	sys_data = sys_data_get();

#ifndef NEW_DEMO_FRAME
	struct nim_lnb_info lnb_info;
	for(i=0;i<2;i++)
	{
        lib_nimg_get_lnb_info(i+1,&lnb_info);
        if(LNB_POWER_OFF == sys_data->bLNB_power)
            lnb_info.lnb_power_off = 1;
        else
            lnb_info.lnb_power_off = 0;                      
		lib_nimg_set_lnb_info(i+1,&lnb_info);
	}
#else
	struct nim_config lnb_info;
	struct nim_device *nim;
UINT16 i;
	for(i=0;i<2;i++)
	{
        nim = (struct nim_device *)dev_get_by_id(HLD_DEV_TYPE_NIM, i);
        dev_get_nim_config(nim,FRONTEND_TYPE,&lnb_info);
        if(LNB_POWER_OFF == sys_data->bLNB_power)
            lnb_info.antenna.antenna_enable = /*0*/1;   //Seiya fix BUG37540:
        else
            lnb_info.antenna.antenna_enable = 1;                   
	    dev_set_nim_config(nim, FRONTEND_TYPE, &lnb_info);
	}
#endif

	msel =&miscset_sel1;
	val = OSD_GetMultiselSel(msel);
	sys_data->chan_sw = val;
	
	msel =&miscset_sel2;
	val = OSD_GetMultiselSel(msel);
	sys_data->chchgvideo_type = val;

#ifdef CHANCHG_VIDEOTYPE_SUPPORT
#ifndef NEW_DEMO_FRAME
	UIChChgSetVideoType(sys_data->chchgvideo_type);
#endif
#endif
	
	msel =&miscset_sel3;
	val = OSD_GetMultiselSel(msel);
	sys_data->install_beep = val;

    msel =&miscset_sel4;
	val = OSD_GetMultiselSel(msel);
	sys_data->auto_standby_en= val;


#ifdef ORDER_GZ1207009
	   msel =&miscset_sel6;
	val = OSD_GetMultiselSel(msel);
	sys_data->standbymode= val;
#endif

#ifdef RAM_TMS_TEST
    msel =&miscset_sel5;
	val = OSD_GetMultiselSel(msel);

	char rec_part[16];
	char tms_part[16];

	if (sys_data->ram_tms_en != val) // detach tms part
	{
		rec_part[0] = tms_part[0] = 0;
		pvr_get_cur_mode(rec_part, tms_part);
		if (tms_part[0] != 0)
		{
			if (STRCMP(rec_part, tms_part) == 0)
				pvr_set_disk_use(PVR_REC_ONLY_DISK, rec_part);
			else
				pvr_detach_part(tms_part, PVR_TMS_ONLY_DISK);
			api_pvr_adjust_tms_space();
		}
	}
	
	if (sys_data->ram_tms_en == 0 && val == 1) // enable RAM disk timeshift
	{
		UINT32 ram_len = RAM_DISK_SIZE;	
		UINT32 ram_addr = (void *)(RAM_DISK_ADDR & 0x0fffffff | 0x80000000);

		ramdisk_create((UINT32)ram_addr, ram_len);

		struct pvr_register_info pvr_reg_info;
		MEMSET(&pvr_reg_info, 0, sizeof(struct pvr_register_info));
		STRCPY(pvr_reg_info.mount_name, "/mnt/rda1");
		pvr_reg_info.disk_usage = PVR_TMS_ONLY_DISK;
		pvr_reg_info.sync = 1;
		pvr_reg_info.init_list = 0;
		pvr_reg_info.check_speed = 0;
		pvr_register((UINT32)&pvr_reg_info, 0);
	}
	else if (sys_data->ram_tms_en == 1 && val == 0) // disable RAM disk timeshift
	{
		ramdisk_delete();
	}

	if (sys_data->ram_tms_en != val)
	{
		if (val == 0) // disable RAM disk timeshift, select PVR partition again
		{
			UINT8 back_saved;
			rec_part[0] = tms_part[0] = 0;
			pvr_select_part(rec_part, tms_part);
			if (rec_part[0] != 0 || tms_part[0] != 0)
			{
				win_compopup_init(WIN_POPUP_TYPE_SMSG); 					   
				win_compopup_set_msg_ext("Init PVR partitions, please wait...", NULL, 0);
				win_compopup_open_ext(&back_saved);
				if (STRCMP(rec_part, tms_part) == 0)
				{
					pvr_change_part(rec_part, PVR_REC_AND_TMS_DISK);
				}
				else
				{
					pvr_change_part(rec_part, PVR_REC_ONLY_DISK);
					pvr_change_part(tms_part, PVR_TMS_ONLY_DISK);
				}
				win_compopup_smsg_restoreback();
			}
		}
		
		struct dvr_HDD_info hdd_info;
		pvr_get_HDD_info(&hdd_info);
		api_pvr_check_level(&hdd_info);
		if (pvr_get_cur_mode(NULL, NULL) == PVR_DISK_INVALID)
		{
			api_pvr_clear_up_all();
		}
	}
	sys_data->ram_tms_en = val;
#endif

    sys_data_save(1);
    
}
Beispiel #4
0
/* Register volume for PVR record or timeshift.
 * 	1. it should be call when volume mounted
 *  @b_force: force to select volumes for pvr, don't wait other devices
 */
static int pvr_disk_attach_proc(BOOL b_force)
{
	SYSTEM_DATA *sys_data = sys_data_get();;
	enum PVR_DISKMODE pvr_mode;
	char rec_vol[16], tms_vol[16];
	struct statvfs buf;
	struct pvr_register_info pvr_reg_info;
	BOOL b_wait = TRUE;

	if (pvr_part_init_task_id != OSAL_INVALID_ID)
	{
		DM_DEBUG("pvr partition %s is initializing to %d\n",
			l_pvr_reg_info.mount_name, l_pvr_reg_info.disk_usage);
		return 0;
	}
	
	DM_DEBUG("Enter %s(%d) ...\n", __FUNCTION__, b_force);
	pvr_mode = pvr_get_cur_mode(rec_vol, tms_vol);
	switch (pvr_mode)
	{
		case PVR_DISK_REC_AND_TMS:
		case PVR_DISK_REC_WITH_TMS:
			DM_DEBUG("pvr partition already init (%s, %s)\n", rec_vol, tms_vol);
			return 0;
		case PVR_DISK_ONLY_REC:
			/* check if tms volume valid */
			DM_DEBUG("pvr rec partition already init (%s, %s)\n", rec_vol, tms_vol);
			if ((tms_vol[0] == 0) && (STRLEN(sys_data->tms_disk) > 0) &&
				(fs_statvfs(sys_data->tms_disk, &buf) >= 0))
			{
				MEMSET(&pvr_reg_info, 0, sizeof(struct pvr_register_info));
				STRCPY(pvr_reg_info.mount_name, sys_data->tms_disk);
				pvr_reg_info.disk_usage = PVR_TMS_ONLY_DISK;
				pvr_reg_info.sync = 1;
				pvr_reg_info.init_list = 0;
#ifndef PVR_SPEED_PRETEST_DISABLE  /* --doy, 2011-3-21*/
				pvr_reg_info.check_speed = 1;
#endif
				pvr_part_init_task_create(&pvr_reg_info);
			}
			return 0;
		case PVR_DISK_ONLY_TMS:
			/* check if rec volume valid */
			DM_DEBUG("pvr tms partition already init (%s, %s)\n", rec_vol, tms_vol);
			if ((rec_vol[0] == 0) && (STRLEN(sys_data->rec_disk) > 0) &&
				(fs_statvfs(sys_data->rec_disk, &buf) >= 0))
			{
				MEMSET(&pvr_reg_info, 0, sizeof(struct pvr_register_info));
				STRCPY(pvr_reg_info.mount_name, sys_data->rec_disk);
				pvr_reg_info.disk_usage = PVR_REC_ONLY_DISK;
				pvr_reg_info.sync = 1;
				pvr_reg_info.init_list = 1;
#ifndef PVR_SPEED_PRETEST_DISABLE  /* --doy, 2011-3-21*/
				pvr_reg_info.check_speed = 1;
#endif
				pvr_part_init_task_create(&pvr_reg_info);
			}
			return 0;
		default:
			DM_DEBUG("pvr partition not init\n");
			break;
	}

	STRCPY(rec_vol, sys_data->rec_disk);
	STRCPY(tms_vol, sys_data->tms_disk);
	rec_vol[1] = tms_vol[1] = 'd';
	rec_vol[2] = tms_vol[2] = 'e';
	rec_vol[3] = tms_vol[3] = 'v';
	rec_vol[8] = tms_vol[8] = '\0';  // temp for disk path, eg. "/dev/uda"
	
	if ((rec_vol[0] == 0 && tms_vol[0] == 0) ||
		(tms_vol[0] == 0 && fs_statvfs(rec_vol, &buf) >= 0) ||
		(rec_vol[0] == 0 && fs_statvfs(tms_vol, &buf) >= 0) ||
		(fs_statvfs(rec_vol, &buf) >= 0 && fs_statvfs(tms_vol, &buf) >= 0))
	{
		b_wait = FALSE;
	}
	
	if (b_force || !b_wait)
	{
		// register rec and tms partition
		dm_pvr_timer_stop();
		DM_DEBUG("To register volume for PVR ...\n");
		pvr_select_part(rec_vol, tms_vol);

		if (STRLEN(tms_vol) > 0 && STRCMP(rec_vol, tms_vol) != 0)
		{
			MEMSET(&pvr_reg_info, 0, sizeof(struct pvr_register_info));
			STRCPY(pvr_reg_info.mount_name, tms_vol);
			pvr_reg_info.disk_usage = PVR_TMS_ONLY_DISK;
			pvr_reg_info.init_list = 0;
#ifndef PVR_SPEED_PRETEST_DISABLE  /* --doy, 2011-3-21*/
			pvr_reg_info.check_speed = 1;
#endif
			if (STRLEN(rec_vol) > 0)
			{	// init partition takes no time when (sync == 0), call pvr_register() directly
				pvr_reg_info.sync = 0;
				pvr_register((UINT32)&pvr_reg_info, 0);
			}
			else
			{
				pvr_reg_info.sync = 1;
				pvr_part_init_task_create(&pvr_reg_info);
			}
		}
		
		if (STRLEN(rec_vol) > 0)
		{
			MEMSET(&pvr_reg_info, 0, sizeof(struct pvr_register_info));
			STRCPY(pvr_reg_info.mount_name, rec_vol);
			pvr_reg_info.disk_usage = (!STRCMP(rec_vol, tms_vol)) ? PVR_REC_AND_TMS_DISK : PVR_REC_ONLY_DISK;
			pvr_reg_info.sync = 1;
			pvr_reg_info.init_list = 1;
#ifndef PVR_SPEED_PRETEST_DISABLE  /* --doy, 2011-3-21*/
			pvr_reg_info.check_speed = 1;
#endif
			pvr_part_init_task_create(&pvr_reg_info);
		}

		if (rec_vol)
			STRCPY(sys_data->rec_disk, rec_vol);

		if (tms_vol)
			STRCPY(sys_data->tms_disk, tms_vol);

		sys_data_save(0);
	}
	else /* we need to wait default disk ready */
	{
		dm_pvr_timer_start(5000);
	}
	
	return 0;
}
Beispiel #5
0
/* change partition @part_path to @part_mode, for pvr */
int pvr_change_part(const char *part_path, UINT8 part_mode)
{
	struct dvr_HDD_info hdd_info;
	struct pvr_register_info pvr_reg_info;
	char rec_part[16], tms_part[16];
	enum PVR_DISKMODE cur_pvr_mode;
	SYSTEM_DATA *sys_data;
	BOOL register_part = FALSE;
	int ret = 0;

	if (part_path == NULL || part_path[0] == 0)
		return -1;

	DM_DEBUG("%s() change %s to %d\n", __FUNCTION__, part_path, part_mode);
	sys_data = sys_data_get();
	cur_pvr_mode = pvr_get_cur_mode(rec_part, tms_part);

	MEMSET(&pvr_reg_info, 0, sizeof(struct pvr_register_info));
	STRCPY(pvr_reg_info.mount_name, part_path);
	pvr_reg_info.disk_usage = part_mode;
	pvr_reg_info.sync = 1;
	
	switch (part_mode)
	{
		case PVR_REC_AND_TMS_DISK:
			if (cur_pvr_mode == PVR_DISK_REC_AND_TMS)
			{
				pvr_detach_part(rec_part, PVR_REC_AND_TMS_DISK);
			}
			else
			{
				pvr_detach_part(rec_part, PVR_REC_ONLY_DISK);
				pvr_detach_part(tms_part, PVR_TMS_ONLY_DISK);
			}
			
			pvr_reg_info.init_list = 1;
#ifndef PVR_SPEED_PRETEST_DISABLE  /* --doy, 2011-3-21*/
			pvr_reg_info.check_speed = 1;
#endif
			if (pvr_register((UINT32)&pvr_reg_info, 0) != SUCCESS)
			{
				api_pvr_clear_up_all();
				ret = -1;
			}
			STRCPY(sys_data->rec_disk, part_path);
			STRCPY(sys_data->tms_disk, part_path);
			sys_data_save(0);
			break;
		case PVR_REC_ONLY_DISK:
			if ((STRLEN(rec_part) > 0) && (STRCMP(rec_part, part_path) == 0))
			{
				 // same partition
				if ((cur_pvr_mode == PVR_DISK_ONLY_REC) ||
					(cur_pvr_mode == PVR_DISK_REC_WITH_TMS))
				{
					break;
				}
				else if (cur_pvr_mode == PVR_DISK_REC_AND_TMS)
				{
					pvr_set_disk_use(PVR_REC_ONLY_DISK, part_path);
				}
				else
				{
					DM_DEBUG("rec_part: %s, mount_name: %s, mode: %d, %d\n",
							 rec_part, part_path, cur_pvr_mode, part_mode);
					register_part = TRUE;
					//SDBBP();
				}
			}
			else // diff partition
			{
				register_part = TRUE;
				if (cur_pvr_mode == PVR_DISK_REC_AND_TMS)
				{
					pvr_set_disk_use(PVR_TMS_ONLY_DISK, tms_part);
				}

				if ((cur_pvr_mode == PVR_DISK_ONLY_REC) ||
					(cur_pvr_mode == PVR_DISK_REC_WITH_TMS))
				{
					pvr_detach_part(rec_part, PVR_REC_ONLY_DISK);
				}

				if ((STRCMP(tms_part, part_path) == 0) && 
					((cur_pvr_mode == PVR_DISK_ONLY_TMS) ||
					 (cur_pvr_mode == PVR_DISK_REC_WITH_TMS)))
				{
					pvr_detach_part(tms_part, PVR_TMS_ONLY_DISK);
				}
			}
			if (register_part)
			{
				pvr_reg_info.init_list = (part_mode != PVR_TMS_ONLY_DISK);
#ifndef PVR_SPEED_PRETEST_DISABLE  /* --doy, 2011-3-21*/
				pvr_reg_info.check_speed = 1;
#endif
				//osal_task_sleep(1000); // wait for pvr cleanup finished
				if (pvr_register((UINT32)&pvr_reg_info, 0) != SUCCESS)
				{
					ret = -1;
				}
			}
			STRCPY(sys_data->rec_disk, part_path);
			if(!STRCMP(sys_data->tms_disk, part_path))
				STRCPY(sys_data->tms_disk, "");
			sys_data_save(0);
			break;
		case PVR_TMS_ONLY_DISK:				
			if ((STRLEN(tms_part) > 0) && (STRCMP(tms_part, part_path) == 0))
			{
				 // same partition
				if ((cur_pvr_mode == PVR_DISK_ONLY_TMS) ||
					(cur_pvr_mode == PVR_DISK_REC_WITH_TMS))
				{
					break;
				}
				else if (cur_pvr_mode == PVR_DISK_REC_AND_TMS)
				{
					pvr_set_disk_use(PVR_TMS_ONLY_DISK, part_path);
				}
				else
				{
					DM_DEBUG("rec_part: %s, mount_name: %s, mode: %d, %d\n",
							 rec_part, part_path, cur_pvr_mode, part_mode);
					register_part = TRUE;
					//SDBBP();
				}
			}
			else // diff partition
			{
				register_part = TRUE;
				if (cur_pvr_mode == PVR_DISK_REC_AND_TMS)
				{
					pvr_set_disk_use(PVR_REC_ONLY_DISK, rec_part);
				}

				if ((cur_pvr_mode == PVR_DISK_ONLY_TMS) ||
					(cur_pvr_mode == PVR_DISK_REC_WITH_TMS))
				{
					pvr_detach_part(tms_part, PVR_TMS_ONLY_DISK);
				}

				if ((STRCMP(rec_part, part_path) == 0) && 
					((cur_pvr_mode == PVR_DISK_ONLY_REC) ||
					 (cur_pvr_mode == PVR_DISK_REC_WITH_TMS)))
				{
					pvr_detach_part(rec_part, PVR_REC_ONLY_DISK);
				}
			}

			if (register_part)
			{
				pvr_reg_info.init_list = (part_mode != PVR_TMS_ONLY_DISK);
#ifndef PVR_SPEED_PRETEST_DISABLE  /* --doy, 2011-3-21*/
				pvr_reg_info.check_speed = 1;
#endif
				//osal_task_sleep(1000); // wait for pvr cleanup finished
				if (pvr_register((UINT32)&pvr_reg_info, 0) != SUCCESS)
				{
					ret = -1;
				}
			}
			STRCPY(sys_data->tms_disk, part_path);
			if(!STRCMP(sys_data->rec_disk, part_path))
				STRCPY(sys_data->rec_disk, "");
			sys_data_save(0);
			break;
		default:
			break;
	}
	
	api_pvr_adjust_tms_space();
	pvr_get_HDD_info(&hdd_info);
	api_pvr_check_level(&hdd_info);
	return ret;
}
Beispiel #6
0
BOOL usb_remove_safely_by_hotkey()
{
	int disk_num, tot_disk_num = 0;
	char disk_name[8];
	int ret;
	UINT32 choice;
	UINT8 disk_sel;
	UINT8 back_saved;
	POBJECT_HEAD topmenu;
		
	ret = dm_ioctl(DM_CMD1_GET_DISK_NUM, DM_CMD_PARAM(MNT_TYPE_USB, 0, 0), &disk_num, sizeof(int));
	if (ret == 0 && disk_num > 0)
		tot_disk_num += disk_num;

	ret = dm_ioctl(DM_CMD1_GET_DISK_NUM, DM_CMD_PARAM(MNT_TYPE_SD, 0, 0), &disk_num, sizeof(int));
	if (ret == 0 && disk_num > 0)
		tot_disk_num += disk_num;

	ret = dm_ioctl(DM_CMD1_GET_DISK_NUM, DM_CMD_PARAM(MNT_TYPE_SATA, 0, 0), &disk_num, sizeof(int));
	if (ret == 0 && disk_num > 0)
		tot_disk_num += disk_num;

	if (tot_disk_num <= 0)
	{
		return TRUE;
	}
	api_inc_wnd_count();
	ID timer_id = win_compopup_start_send_key_timer(V_KEY_EXIT, 10000, TIMER_ALARM); // exit popup if no action in 5s
	choice = win_disk_operate_open(OPERATE_TYPE_DISK_REMOVE, &disk_sel);
	api_stop_timer(&timer_id);
	
	if ((topmenu = menu_stack_get_top()) != NULL)
		OSD_TrackObject(topmenu, C_DRAW_SIGN_EVN_FLG | C_UPDATE_ALL);
	
	if (!choice)
	{
		api_dec_wnd_count();
		return TRUE;
	}
	else
	{
		win_removable_disk_get_name_str(disk_sel, disk_name);
	}
		
#ifdef DVR_PVR_SUPPORT
	enum PVR_DISKMODE pvr_mode;
	char rec_vol[16], tms_vol[16];
	struct statvfs buf;

	pvr_mode = pvr_get_cur_mode(rec_vol, tms_vol);

	if (api_pvr_is_record_active() && (STRLEN(rec_vol) == 9) &&
		(strncmp(disk_name, &rec_vol[5], 3) == 0))
	{
		win_compopup_init(WIN_POPUP_TYPE_OK);
	    win_compopup_set_msg("USB safely remove error, please stop recording first!", NULL, 0);
	    win_compopup_open_ext(&back_saved);
		api_dec_wnd_count();
		return TRUE;
	}

	if (api_pvr_is_playing())
	{
		BOOL b_can_remove = TRUE;
		if ((pvr_info.pvr_state == PVR_STATE_TMS_PLAY) &&
			(STRLEN(tms_vol) == 9) && (strncmp(disk_name, &tms_vol[5], 3) == 0))
		{
			b_can_remove = FALSE;
		}
		else if ((pvr_info.pvr_state != PVR_STATE_TMS_PLAY) &&
				 (STRLEN(rec_vol) == 9) && (strncmp(disk_name, &rec_vol[5], 3) == 0))
		{
			b_can_remove = FALSE;
		}

		if (!b_can_remove)
		{
			win_compopup_init(WIN_POPUP_TYPE_OK);
		    win_compopup_set_msg("USB safely remove error, please stop playing first!", NULL, 0);
		    win_compopup_open_ext(&back_saved);
			api_dec_wnd_count();
			return TRUE;
		}
	}

	if (pvr_info.pvr_state == PVR_STATE_TMS)
	{
		api_pvr_tms_proc(FALSE);
		fs_sync(tms_vol);
	}
#endif

#ifdef USB_SUPPORT_HUB
	/* remove disk */
	int disk_type = diskNamePrefix2Type(disk_name);
	if (disk_type == MNT_TYPE_USB)
	{
		char dev_path[16];
		int node_id, fd;
		sprintf(dev_path, "/dev/%s", disk_name);
		fd = fs_open(dev_path, O_RDONLY, 0);
		ret = fs_ioctl(fd, IOCTL_GET_NODEID, &node_id, sizeof(int));
		fs_close(fd);

		if (ret == 0)
			usbd_safely_remove_ex(node_id);
	}
#ifdef SDIO_SUPPORT
	else if (disk_type == MNT_TYPE_SD)
	{
		sd_notify(0);
	}
#endif
#ifdef SATA_SUPPORT
	else if (disk_type == MNT_TYPE_SATA)
	{
		sata_notify(0, 0);
	}
#endif
#else
	usbd_safely_remove();
#endif
	
	api_dec_wnd_count();
	return TRUE;
}
Beispiel #7
0
/* Un-register pvr volume if necessary
 * 	1. it should be call when disk detach
 */
static int pvr_disk_detach_proc()
{
	struct statvfs buf;
	enum PVR_DISKMODE pvr_mode;
	char rec_vol[16], tms_vol[16], initing_vol[16];
	UINT8 initing_vol_usage = 0;
	BOOL b_pvr_part_detached = FALSE;

	DM_DEBUG("Enter %s() ...\n", __FUNCTION__);

	if (pvr_part_init_task_id != OSAL_INVALID_ID)
	{
		DM_DEBUG("pvr partition %s is initializing to %d\n",
			l_pvr_reg_info.mount_name, l_pvr_reg_info.disk_usage);
		
		STRCPY(initing_vol, l_pvr_reg_info.mount_name);
		initing_vol_usage = l_pvr_reg_info.disk_usage;
	}
	else
	{
		initing_vol[0] = 0;
	}
	
	pvr_mode = pvr_get_cur_mode(rec_vol, tms_vol);

	BOOL rec_vol_detach = ((rec_vol[0] != 0) && (fs_statvfs(rec_vol, &buf) < 0));
	BOOL tms_vol_detach = ((tms_vol[0] != 0) && (fs_statvfs(tms_vol, &buf) < 0));

	if ((initing_vol[0] != 0) && (fs_statvfs(initing_vol, &buf) < 0))
	{
		if (STRCMP(initing_vol, rec_vol) != 0)
		{
			DM_DEBUG("pvr detach initializing volume %s\n", initing_vol);
			pvr_detach_part(initing_vol, initing_vol_usage);
			b_pvr_part_detached = TRUE;
		}
		initing_vol[0] = 0;
	}

	if (rec_vol_detach || tms_vol_detach)
	{
		/* a disk that used by pvr is detached */
		if (STRCMP(rec_vol, tms_vol) == 0)
		{
			DM_DEBUG("pvr detach %s\n", rec_vol);
			pvr_detach_part(rec_vol, PVR_REC_AND_TMS_DISK);
			b_pvr_part_detached = TRUE;
		}
		else
		{
			if (rec_vol_detach)
			{
				DM_DEBUG("pvr detach %s\n", rec_vol);
				pvr_detach_part(rec_vol, PVR_REC_ONLY_DISK);
				b_pvr_part_detached = TRUE;
			}

			if (tms_vol_detach)
			{
				DM_DEBUG("pvr detach %s\n", tms_vol);
				pvr_detach_part(tms_vol, PVR_TMS_ONLY_DISK);
				b_pvr_part_detached = TRUE;
			}
		}
	}

	if ((pvr_get_cur_mode(rec_vol, tms_vol) == PVR_DISK_INVALID) &&
		(initing_vol[0] == 0))
	{
		DM_DEBUG("pvr detach all volume, do clean up!\n");
		api_pvr_clear_up_all();
	}

	if (b_pvr_part_detached)
	{
		struct dvr_HDD_info hdd_info;
		pvr_get_HDD_info(&hdd_info);
		api_pvr_check_level(&hdd_info);
	}
	return 0;
}