⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 otgmsapp.c

📁 linux下的usb开发
💻 C
📖 第 1 页 / 共 3 页
字号:
/************************************************************* * Philips otg mass storage demo * * (c) 2002 Koninklijke Philips Electronics N.V., All rights reserved *  * This  source code and any compilation or derivative thereof is the * proprietary information of Koninklijke Philips Electronics N.V. * and is confidential in nature. * Under no circumstances is this software to be exposed to or placed * under an Open Source License of any type without the expressed * written permission of Koninklijke Philips Electronics N.V. * * File Name:	otgmsapp.c * * History:	 * *	Version	Date		Author		Comments * ------------------------------------------------- * 	1.0		09/23/02	SYARRA		Initial Creation * *************************************************************/#include <stdio.h>#include <gtk/gtk.h>#include<fcntl.h>#include<stdio.h>#include<stdlib.h>#include<signal.h>#include<sys/ioctl.h>#include<sys/shm.h>#include<unistd.h>#include<string.h>#include "usb_otg.h"#include "otgmsapp.h"#include "otgtool.h"#define		SHM_KEY		3456#define		DEF_PAD 10#define		DEF_PAD_SMALL 5#define		DEF_MAX_COLOR 3usb_otg_info_t	get_otg_info;usb_otg_info_t	set_otg_info;shm_struct_t	*shm;int				shmid;int				otgfsm_fd;char	sys_cmd[128];char	otg_status_name[][25] = {		/* Status name array */	"NONE                ",	"PROTOCOL TIMEOUT    ",	"VBUS_ERROR          ",	"ENUMERATION SUCCESS ",	"ENUMERATION FAILED  ",	"DEVICE NOT SUPPORTED"};char	otg_state_name[25][15] = {		"B_IDLE",		"B_HOST",		"B_DEVICE",		"B_WAIT_ACON",		"B_SRP_INIT",		"INV_STATE",		"INV_STATE",		"INV_STATE",		"INV_STATE",		"INV_STATE",		"INV_STATE",		"INV_STATE",		"INV_STATE",		"INV_STATE",		"INV_STATE",		"INV_STATE",		"A_IDLE",		"A_HOST",		"A_DEVICE",		"A_WAIT_BCON",		"A_WAIT_VRISE",		"A_SUSPEND",		"A_WAIT_VFALL",		"A_VBUS_ERR"};char	port_id_name[2][10] = {		"Mini A",		"Mini B"};char	otg_local_disk[20]	= LOCAL_OTG_DISK;char	otg_rmt_disk[20]	= RMT_OTG_DISK;static char appClose=0;static char mount_flag=0;static char sourcefile_select=0;	  static char destfile_select=0;	  static int icolor=0;char	printbuffer[200];char	otg_mount_name[10];char	fnamebuffer_sourcedisk[100];char	fnamebuffer_destdisk[100];GtkWidget *isp1362statuslabel;GtkWidget *entry_sourcedisk, *entry_destdisk;GtkWidget *scrolled_window;GtkWidget *statuspadtext;GdkColor colorarray[DEF_MAX_COLOR];void addlist_otgapp( gchar* string){		gfloat value;		GtkAdjustment *adjustment;		gtk_text_freeze (GTK_TEXT (statuspadtext));		gtk_text_insert (GTK_TEXT (statuspadtext), NULL, &colorarray[icolor], NULL, string, -1);		icolor++;		icolor = icolor % DEF_MAX_COLOR;		adjustment= gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW (scrolled_window));	   		if((value= (GTK_TEXT (statuspadtext)->vadj->upper - GTK_TEXT (statuspadtext)->vadj->page_size)))		{			GTK_ADJUSTMENT(adjustment)->value = value; 			gtk_signal_emit_by_name (GTK_OBJECT (adjustment), "changed"); 		}		gtk_text_thaw (GTK_TEXT (statuspadtext));}char find_vid(){	char bFound=0;		system("mount -t usbdevfs 0 /proc/bus/usb");	if( system("grep -iq Vendor=0781  /proc/bus/usb/devices 2>/dev/null"))	{ 		g_print ("OTG:%s\n","Vendor=0781 ProdID=0002 found");		bFound=1;	}		return bFound;}char mount_device(){	char	dev_c, proc_c;	int		result = 0;	int		dev_fd;	char	dev_file_name[32];	char	proc_file_name[64];	dev_c = 'a';	proc_c = '0';	strcpy(dev_file_name,"/dev/sd");	strcpy(proc_file_name,"/proc/scsi/usb-storage-");	while(dev_c < 'e') {				sprintf(dev_file_name,"%s%c","/dev/sd",dev_c);		dev_fd = open(dev_file_name,O_RDWR);		if(dev_fd > 0) {			close(dev_fd);			sprintf(sys_cmd,"mount %s1 %s\n",dev_file_name,RMT_OTG_DISK);			system(sys_cmd);			result = 1;			}		dev_c++;		proc_c++;	}	if(result) {		sprintf(sys_cmd,"dd if=%s of=%s1 bs=%d skip=%d >/dev/null\n",MSDISK_FILE,MSDISK_FILE,BLOCK_SIZE,LINUX_UNIT_SIZE);		system(sys_cmd);		sprintf(sys_cmd,"mount %s1 %s -o loop\n",MSDISK_FILE,LOCAL_OTG_DISK);		system(sys_cmd);		mount_flag = 1;	}	return result;}char umount_device(){	char	bFound = mount_flag;	if(mount_flag==1) {		sprintf(sys_cmd,"umount %s\n",LOCAL_OTG_DISK);		system(sys_cmd);		sprintf(sys_cmd,"dd if=%s1 of=%s bs=%d seek=%d >/dev/null\n",MSDISK_FILE,MSDISK_FILE,BLOCK_SIZE,LINUX_UNIT_SIZE);		system(sys_cmd);		sprintf(sys_cmd,"umount %s\n",RMT_OTG_DISK);		system(sys_cmd);		mount_flag = 0;		sourcefile_select = 0;		destfile_select = 0;		gtk_entry_set_text (GTK_ENTRY (entry_sourcedisk), "Local Disk not Available");		gtk_entry_set_text (GTK_ENTRY (entry_destdisk), "Remote Disk not Available");	}	return bFound;}void display_current_state(){	int	i;	sprintf(printbuffer, "%s",  otg_state_name[get_otg_info.state]);	gtk_label_set_text  ((GtkLabel*)isp1362statuslabel, printbuffer);	if(get_otg_info.state == OTG_INV_STATE) {		sprintf(printbuffer, "Port Status:: %s \n", "OTG Hw Not Initialized");		addlist_otgapp(printbuffer);	} else {		sprintf(printbuffer, "plugged:: %s     state:: %s \n", port_id_name[get_otg_info.id], otg_state_name[get_otg_info.state]);		addlist_otgapp(printbuffer);	}	for(i=0;i<shm->signal_count;i++){		sprintf(printbuffer,"state change::  %s\n",otg_state_name[shm->state[i]]);		addlist_otgapp(printbuffer);	}	shm->signal_count = 0;	shm->signal = 0;	shm->flag = 0;}void sig_handler(int	signal){	ioctl(otgfsm_fd, OTG_IOC_GET_STATE, &get_otg_info);	shm->flag = 1;	shm->signal = 1;	shm->c = 'R';	shm->state[shm->signal_count] = get_otg_info.state;	shm->signal_count = (shm->signal_count+1) % MAX_PREV_OTG_STATES;	if(get_otg_info.state == OTG_A_VBUS_ERR) { 					/* This can only happen to A device, bring back it to IDLE state */		shm->c = 'C';											/* Clear VBUS ERROR */	}	if(get_otg_info.status_code == OTG_STATUS_ENUM_FAILED) {		shm->c = 'I'; 											/* Enumeration failed, go back to Idle */	}		display_current_state();	//handle the unmount here based on the state change.	if( (mount_flag == 1) && 	( get_otg_info.state != OTG_A_HOST && 	  get_otg_info.state != OTG_B_HOST ) ) {		umount_device();	}}void close_otgapp( GtkWidget *widget,                        gpointer   data ){    umount_device();	set_otg_info.state = OTG_IDLE;	ioctl(otgfsm_fd, OTG_IOC_SET_STATE, &set_otg_info);	ioctl(otgfsm_fd, OTG_IOC_GET_STATE, &get_otg_info);	appClose = 1;	close(otgfsm_fd) ;	shmdt(shm);    shmctl(shmid,IPC_RMID,0);	gtk_main_quit();}void realize_text( GtkWidget *text,                   gpointer data ){    gtk_text_freeze (GTK_TEXT (text));    gtk_text_insert (GTK_TEXT (text), NULL, &colorarray[0], NULL,			"\t\t\t\t\t\t\t     OTG Test Application\n", -1);    gtk_text_insert (GTK_TEXT (text), NULL, &colorarray[1], NULL,			"\t\t\t\t\t\t\t Philips Innovation Center APIC\n", -1);      gtk_text_insert (GTK_TEXT (text), NULL, &colorarray[2], NULL,			"\t\t\t\t\t\tPhilips Electronics Singapore Pte Ltd\n", -1);   	gtk_text_thaw (GTK_TEXT (text));}   /* Create a scrolled text area that displays a "message" */GtkWidget *create_text( void ){    GtkWidget *scrolled_window;   	/* Create a new scrolled window, with scrollbars only */	scrolled_window = gtk_scrolled_window_new (NULL, NULL);	gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);	gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),								  GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);	gtk_widget_set_usize(scrolled_window, 200, 270);	/* Put a text widget in the upper left hand corner. Note the use of	* GTK_SHRINK in the y direction */	statuspadtext = gtk_text_new (NULL, NULL);	gtk_container_add (GTK_CONTAINER (scrolled_window), statuspadtext);	gtk_widget_grab_focus (statuspadtext);	gtk_text_set_word_wrap(GTK_TEXT( statuspadtext), TRUE);	/* Add a handler to put a message in the text widget when it is realized */	gtk_signal_connect (GTK_OBJECT (statuspadtext), "realize",					  GTK_SIGNAL_FUNC (realize_text), NULL);	return scrolled_window;}voidfile_selection_ok_source (GtkWidget *w,		   GtkFileSelection *fs){	gchar filename[200];	gint	filenamesize=0;	FILE* fp;	sprintf(filename,gtk_file_selection_get_filename (GTK_FILE_SELECTION (fs))); 	fp =fopen(filename,"r");	if(fp>0) fclose(fp);	else	{		sprintf(printbuffer, "Selected file %s does NOT exists\n", filename);		addlist_otgapp(printbuffer);		goto RET;	}	if( (strncmp(filename,otg_local_disk,strlen(otg_local_disk)) != 0 ) &&		 (strncmp(filename,otg_rmt_disk,strlen(otg_rmt_disk)) != 0 ) ) {	sprintf(printbuffer, "%s is not from OTG disk, use normal cp Command \n", filename);	addlist_otgapp(printbuffer);	goto RET;	}	while(filename[filenamesize] != '\0')	filenamesize++;	if( fp >0 && filename[filenamesize-1]!='/' )	{	sourcefile_select=1;	addlist_otgapp("Source file selection is okay\n");	gtk_entry_set_text (GTK_ENTRY (entry_sourcedisk), filename);	}	else	{	  sourcefile_select=0;	  if( filename[filenamesize-1]=='/')	  { 		sprintf(printbuffer, "Hunh, so you wish to copy/move/delete a DIRECTORY itself\n");		addlist_otgapp(printbuffer);		sprintf(printbuffer, "Please select a file .........\n");		addlist_otgapp(printbuffer);	  }	}RET:	gtk_widget_destroy (GTK_WIDGET (fs));}voidfile_selection_ok_dest (GtkWidget *w,		   GtkFileSelection *fs){	gchar filename[200];	FILE* fp;	sprintf(filename,gtk_file_selection_get_filename (GTK_FILE_SELECTION (fs))); 	fp =fopen(filename,"r");	if(fp>0) fclose(fp);	else	{		sprintf(printbuffer, "Selected file %s does NOT exists\n", filename);		addlist_otgapp(printbuffer);	}	if( (strncmp(filename,otg_local_disk,strlen(otg_local_disk)) != 0 ) &&		 (strncmp(filename,otg_rmt_disk,strlen(otg_rmt_disk)) != 0 ) ) {	sprintf(printbuffer, "%s is not from OTG disk, use normal cp Command \n", filename);	addlist_otgapp(printbuffer);	goto RET1 ;	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -