Esempio n. 1
0
void Speedtest_Run(GUI_Widget *widget) {

	uint8 *buff = (uint8*)0x8c400000;
	size_t buff_size = 0x10000;
	int size = 0x800000, cnt = 0, rs; 
	int64 time_before, time_after;
	uint32 t;
	double speed;
	file_t fd;
	int read_only = 0;
	
	char name[64];
	char result[128];
	const char *wname = GUI_ObjectGetName((GUI_Object *)widget);
	
	if(!strncasecmp(wname, "/cd", 3)) {
		
		read_only = 1;
		snprintf(name, sizeof(name), "%s/1DS_CORE.BIN", wname);

		if(FileExists(name)) {
			goto readtest;
		} else {
			snprintf(name, sizeof(name), "%s/1ST_READ.BIN", wname);
			goto readtest;
		}
	}
	
	show_status_ok("Testing WRITE speed...");
	GUI_LabelSetText(self.speedwr, "...");
	GUI_LabelSetText(self.speedrd, "   ");
	
	snprintf(name, sizeof(name), "%s/%s.tst", wname, lib_get_name());
	
	if(FileExists(name)) {
		fs_unlink(name);
	}
	
	/* WRITE TEST */
	fd = fs_open(name, O_CREAT | O_WRONLY);
	
	if (fd == FILEHND_INVALID) {
		ds_printf("DS_ERROR: Can't open %s for write: %d\n", name, errno);
		show_status_error("Can't open file for write");
		return;
	}

	ShutdownVideoThread(); 
	time_before = timer_ms_gettime64();
	
	while(cnt < size) {
		
		rs = fs_write(fd, buff, buff_size);
		
		if(rs <= 0) {
			fs_close(fd);
			InitVideoThread(); 
			ds_printf("DS_ERROR: Can't write to file: %d\n", errno);
			show_status_error("Can't write to file");
			return;
		}
		
		buff += rs;
		cnt += rs;
	}
	
	time_after = timer_ms_gettime64();
	InitVideoThread();
	
	t = (uint32)(time_after - time_before);
	speed = size / ((float)t / 1000);
	fs_close(fd);
	
	snprintf(result, sizeof(result), 
				"Write speed %.2f Kbytes/s (%.2f Mbit/s) Time: %ld ms",
				speed / 1024, ((speed / 1024) / 1024) * 8, t);
	
	GUI_LabelSetText(self.speedwr, result);
	show_status_ok("Complete!"); 
	
	ds_printf("DS_OK: Complete!\n"
				" Test: write\n Time: %ld ms\n"
				" Speed: %.2f Kbytes/s (%.2f Mbit/s)\n"
				" Size: %d Kb\n Buff: %d Kb\n", 
				t, speed / 1024, 
				((speed / 1024) / 1024) * 8, 
				size / 1024, buff_size / 1024); 
				
readtest:

	show_status_ok("Testing READ speed...");
	GUI_LabelSetText(self.speedrd, "...");

	/* READ TEST */
	fd = fs_open(name, O_RDONLY);
	
	if (fd == FILEHND_INVALID) {
		ds_printf("DS_ERROR: Can't open %s for read: %d\n", name, errno);
		show_status_error("Can't open file for read");
		return;
	}

	if(read_only) {
		GUI_LabelSetText(self.speedwr, "Write test passed");
		/* Reset ISO9660 filesystem cache */
		fs_ioctl(fd, NULL, 0);
		fs_close(fd);
		fd = fs_open(name, O_RDONLY);
	}
	
	time_before = time_after = t = cnt = 0;
	speed = 0.0f;
	size = fs_total(fd);
	buff = rd_buff;

	ShutdownVideoThread();
	time_before = timer_ms_gettime64();

	while(cnt < size) {
		
		rs = fs_read(fd, buff, buff_size);
		
		if(rs <= 0) {
			fs_close(fd);
			InitVideoThread(); 
			ds_printf("DS_ERROR: Can't read file: %d\n", errno);
			show_status_error("Can't read file");
			return;
		}
		
		cnt += rs;
	}
	
	time_after = timer_ms_gettime64();
	t = (uint32)(time_after - time_before);
	speed = size / ((float)t / 1000);
	fs_close(fd);
	
	if(!read_only) { 
		fs_unlink(name);
	} else {
		cdrom_spin_down();
	}
	
	snprintf(result, sizeof(result), 
			"Read speed %.2f Kbytes/s (%.2f Mbit/s) Time: %ld ms",
			speed / 1024, ((speed / 1024) / 1024) * 8, t);
	
	InitVideoThread();
	
	ds_printf("DS_OK: Complete!\n"
				" Test: read\n Time: %ld ms\n"
				" Speed: %.2f Kbytes/s (%.2f Mbit/s)\n"
				" Size: %d Kb\n Buff: %d Kb\n", 
				t, speed / 1024, 
				((speed / 1024) / 1024) * 8, 
				size / 1024, buff_size / 1024);
    
	GUI_LabelSetText(self.speedrd, result);
	show_status_ok("Complete!"); 
}
Esempio n. 2
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;
}
Esempio n. 3
0
static int dm_update(UINT32 dev_type, UINT32 dev_id)
{
	char disk_name[8];
	char dev_path[16];
	char vol_path[16];
	DiskInfo *p_disk = NULL;
	DiskInfo **pp_disk = NULL;
	int ret = -1;
	
	if (((dev_type == MNT_TYPE_USB) && (dev_id >= MAX_USB_DISK_NUM)) ||
		((dev_type == MNT_TYPE_SD)  && (dev_id >= MAX_SD_DISK_NUM))  ||
		((dev_type == MNT_TYPE_SATA)  && (dev_id >= MAX_SATA_DISK_NUM))  ||
		((dev_type == MNT_TYPE_IDE) && (dev_id >= MAX_IDE_DISK_NUM)))
	{
		DM_ERROR("Unsupport device (%d, %d)\n", dev_type, dev_id);
		return ret;
	}

	DM_DEBUG("DM update device (%d, %d)\n", dev_type, dev_id);
	DMLock();

	do {
		switch (dev_type)
		{
			case MNT_TYPE_USB:
				sprintf(disk_name, "ud%c", dev_id+'a');
				pp_disk = &g_dm.UsbDisks[dev_id];
				break;
			case MNT_TYPE_SD:
				sprintf(disk_name, "sd%c", dev_id+'a');
				pp_disk = &g_dm.SdDisks[dev_id];
				break;
			case MNT_TYPE_IDE:
				sprintf(disk_name, "hd%c", dev_id+'a');
				pp_disk = &g_dm.IdeDisks[dev_id];
				break;
			case MNT_TYPE_SATA:
				sprintf(disk_name, "sh%c", dev_id+'a');
				pp_disk = &g_dm.SataDisks[dev_id];
				break;
			default:
				disk_name[0] = 0;
				break;
		}

		if (disk_name[0] == 0)
		{
			DM_DEBUG("Unknown device (%d, %d)\n", dev_type, dev_id);
			break;
		}

		if (*pp_disk != NULL)
		{
#if (DM_DEBUG_LEVEL & DM_DEBUG_MALLOC_FREE)
			dm_malloc_cnt--;
#endif
			FREE(*pp_disk);
			*pp_disk = NULL;
		}
		
		if ((p_disk = (DiskInfo *)MALLOC(sizeof(DiskInfo))) ==  NULL)
		{
#if (DM_DEBUG_LEVEL & DM_DEBUG_MALLOC_FREE)
			dm_malloc_cnt++;
#endif
			DM_DEBUG("Memory exhausted!\n", dev_type, dev_id);
			break;
		}

		MEMSET(p_disk, 0, sizeof(DiskInfo));
		sprintf(dev_path, "/dev/%s", disk_name);

		int fd, fd_dir;
		device_geometry geo;
		char dirbuf[sizeof(struct dirent) + 32];
		struct dirent *pdir = (struct dirent *)dirbuf;

		/* get disk info */
		fd = fs_open(dev_path, O_RDONLY, 0);
		if (fd < 0)
		{
			DM_DEBUG("device %s not exist!\n", dev_path);
			break;
		}
		
		if (fs_ioctl(fd, IOCTL_GET_DEVICE_GEOMETRY, &geo, sizeof(struct device_geometry)) < 0)
		{
			fs_close(fd);
			break;	
		}
		p_disk->DiskSize = geo.sector_count * geo.bytes_per_sector;
		fs_close(fd);
		
	    if ((fd_dir = fs_opendir("/dev")) < 0)
	    {
			DM_DEBUG("open /dev failed!\n");
			break;
	    }
		
		ret = 0; /* get necessary disk info successfully */

		int part_idx;
		while (fs_readdir(fd_dir, pdir) > 0)
		{
			/* find partitions */
	        if ((STRLEN(pdir->d_name) == 4) && (strncmp(pdir->d_name, disk_name, 3) == 0))
				
			{
				part_idx = pdir->d_name[3] - '1';
				if ((part_idx < 0) || (part_idx >= MAX_PARTS_IN_DISK))
				{
					continue;
				}
				sprintf(dev_path, "/dev/%s", pdir->d_name);
				sprintf(vol_path, "/mnt/%s", pdir->d_name);

				/* get part info */
				fd = fs_open(dev_path, O_RDONLY, 0);
				if (fs_ioctl(fd, IOCTL_GET_DEVICE_GEOMETRY, &geo, sizeof(struct device_geometry)) < 0)
				{
					fs_close(fd);
					continue;	
				}
				fs_close(fd);
				
				p_disk->parts[part_idx].PartExist = 1;
	 			p_disk->parts[part_idx].FileSystemType = dm_get_fs_type(vol_path);
				p_disk->parts[part_idx].PartSize = geo.sector_count * geo.bytes_per_sector;
				p_disk->part_num++;
				if (p_disk->parts[part_idx].FileSystemType != PED_FS_TYPE_NONE)
					p_disk->vol_num++;
			}
		}
		fs_closedir(fd_dir);
	} while(0);

	if (ret == 0)
	{
		*pp_disk = p_disk;
//		p_disk = NULL;
	}
	else if (p_disk != NULL)
	{
#if (DM_DEBUG_LEVEL & DM_DEBUG_MALLOC_FREE)
		dm_malloc_cnt--;
#endif
		FREE(p_disk);
	}

	DMUnlock();
	
	return ret;
}
Esempio n. 4
0
BOOL usb_remove_safely_by_hotkey()
{
	UINT8 back_saved;

//	if(!storage_usb_menu_item_ready())
//		return FALSE;
#ifdef DVR_PVR_SUPPORT
	if(api_pvr_is_record_active())
	{
		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);
		return TRUE;
	}
	else if(api_pvr_is_playing())
	{
		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);
		return TRUE;
	}
	else if(pvr_info.pvr_state == PVR_STATE_TMS)
	{
		api_pvr_tms_proc(FALSE);
	}
#endif
	win_compopup_init(WIN_POPUP_TYPE_OKNO);
    win_compopup_set_msg("Are you sure to remove USB device safely!", NULL, 0);
	win_compopup_set_default_choice(WIN_POP_CHOICE_NO);
	win_popup_choice_t choice = win_compopup_open_ext(&back_saved);
	if(choice == WIN_POP_CHOICE_YES)
	{
		//api_usb_device_safely_remove();
#ifdef USB_SUPPORT_HUB
	/* remove disk */
	char disk_name[8];
	int ret;
	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;
}
Esempio n. 5
0
int fs_iso_map2dev(const char *filename, kos_blockdev_t *dev) {
	
	file_t fd, fdi;
	uint8 *data;
	uint32 image_type = 0;
	uint32 image_hdr = 0;
	uint32 total_length = 0;
	uint32 lba = 150;
	uint32 sector = lba;
	const char mp[] = "/ifsm2d";
	
	if(dev->init(dev) < 0) {
		ds_printf("DS_ERROR: Can't initialize device\n");
		return -1;
	}
	
	if(fs_iso_mount(mp, filename) < 0) {
		return -1;
	}
	
	fd = fs_iso_first_file(mp);
	
	if(fd == FILEHND_INVALID) {
		ds_printf("DS_ERROR: Can't open first file\n");
		fs_iso_unmount(mp);
		return -1;
	}
	
	fs_ioctl(fd, &image_type, ISOFS_IOCTL_GET_IMAGE_TYPE);
	fs_ioctl(fd, &image_hdr, ISOFS_IOCTL_GET_IMAGE_HEADER_PTR);
	fs_ioctl(fd, &fdi, ISOFS_IOCTL_GET_IMAGE_FD);
	
	fs_ioctl(fd, &lba, ISOFS_IOCTL_GET_DATA_TRACK_LBA);
	fs_ioctl(fd, &total_length, ISOFS_IOCTL_GET_TRACK_SECTOR_COUNT);
	
	fs_close(fd);
	total_length += lba;
	
	data = memalign(32, SECBUF_COUNT * 2048);
	
	if(data == NULL) {
		ds_printf("DS_ERROR: No free memory\n");
		fs_iso_unmount(mp);
		return -1;
	}
	
	memset_sh4(data, 0, SECBUF_COUNT * 2048);

	for(sector = lba; sector < total_length; sector += SECBUF_COUNT) {
		
#ifdef DEBUG
		dbglog(DBG_DEBUG, "%s: read from %ld\n", __func__, sector);
#endif
		
		switch(image_type) {
			case ISOFS_IMAGE_TYPE_CSO:
			case ISOFS_IMAGE_TYPE_ZSO:
				ciso_read_sectors((CISO_header_t*)image_hdr, fdi, data, sector, SECBUF_COUNT);
				break;
			case ISOFS_IMAGE_TYPE_CDI:
				cdi_read_sectors((CDI_header_t*)image_hdr, fdi, data, sector, SECBUF_COUNT);
				break;
			case ISOFS_IMAGE_TYPE_GDI:
				gdi_read_sectors((GDI_header_t*)image_hdr, data, sector, SECBUF_COUNT);
				break;
			case ISOFS_IMAGE_TYPE_ISO:
			default:
				fs_seek(fdi, ((sector - lba) * 2048), SEEK_SET);
				fs_read(fdi, data, SECBUF_COUNT * 2048);
				break;
		}
		
#ifdef DEBUG
		dbglog(DBG_DEBUG, "%s: write to %ld\n", __func__, (sector - lba) * 4);
#endif
		
		if(dev->write_blocks(dev, (sector - lba) * 4, SECBUF_COUNT * 4, data) < 0) {
			ds_printf("DS_ERROR: Can't write to device\n");
			break;
		}
	}
	
	dev->flush(dev);
	fs_iso_unmount(mp);
	return 0;
}