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

📄 usb.c

📁 实现usb在S3C2410开发板的自动挂接
💻 C
字号:
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////  	This procedure let us mount the usb device autoly////  	2008-8-13 ////	philip/////////////////////////////////////////////////////////////////////////#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <string.h>#include <sys/mount.h>#include <unistd.h>#include <pthread.h>#define USB_DISK_MP "/tmp/usbdisk"#define FILE_DEV_CHECK "/proc/scsi/scsi" //用来检测设备数和类型#define FILE_DISC_PARTS_CHECK "/proc/partitions" //用来检测设备的分区情况#define FILE_DEV_STATU_TEMPL "/proc/scsi/usb-storage-%d/%d"   //用来检测某一设备是否在插入状态#define FILE_MOUNT_CHECK "/proc/mounts" //用来检测设备是否被mount#define MAX_NAME_LEN 64
#define MAX_PART_NUM 6   //最多允许6个分区typedef struct s_scsi_usb_dev
{
       int type; /*1 cdrom 2 disk */
       int index; /*like host0 host1*/
       char file_statu[MAX_NAME_LEN]; /*like "/proc/scsi/usb-storage-%d/%d"*/
       char devfile_parts[MAX_PART_NUM][MAX_NAME_LEN]; /*存储每个分区的设备文件*/
       char mount_path[MAX_PART_NUM][MAX_NAME_LEN]; /*与上面对应的mount点*/
       int part_num; //分区数
       struct s_scsi_usb_dev * next_dev; //指向下一个备
} SCSI_USB_DEV;static SCSI_USB_DEV * f_first_dev = NULL;void CLEAR_DEV(void)
{

       SCSI_USB_DEV * cur_dev = f_first_dev;
       SCSI_USB_DEV * tmp_dev;
       while (cur_dev)
       {
              tmp_dev = cur_dev;
              cur_dev = cur_dev->next_dev;
              free(tmp_dev);
       }
       f_first_dev = NULL;
}int INIT_DEV(SCSI_USB_DEV * dev, int index, char * type)
{
       dev->index = index;
       sprintf(dev->file_statu, FILE_DEV_STATU_TEMPL, index, index);
       dev->type = 2;
       dev->part_num = CHECK_PARTS(dev);
       return 1;
}int CHECK_PARTS(SCSI_USB_DEV * dev)
{
       char buf[1024];
       char hoststr[16];
       int fd,len;
       int part_num = 0;
 
       char * line;
       char * delim="\n";
       char * strtok_tmp_ptr;
       char * seek;
       char * part_blocks;

       fd = open(FILE_DISC_PARTS_CHECK, O_RDONLY);
       if( fd > 0 )
       {
              len = read(fd, buf, sizeof(buf));
              close(fd);
              if (len > 0)
              {
                     sprintf(hoststr,"scsi/host%d", dev->index);
                     line = strtok_r(buf, delim, &strtok_tmp_ptr);
                     while(line)
                     {
                            seek = strstr(line, hoststr);
                            if (seek)
                            {
                                   part_blocks = seek - 3;
                                   if (strncmp(part_blocks, " 1 ", 3))
                                   {//not extend part
                                          sprintf(dev->devfile_parts[part_num],"/dev/%s", seek);
                                          sprintf(dev->mount_path[part_num], USB_DISK_MP"/disk%d/part%d",dev->index,part_num);					  printf("%s\n",dev->mount_path[part_num]);
                                          part_num ++;
                                          if (part_num == MAX_PART_NUM)
                                          {
                                                 break;//too many parts ignore 
                                          }
                                   }
                            }
                            line = strtok_r(NULL, delim, &strtok_tmp_ptr);
                     }
              }
       }
       else
       {
              printf("error ! can't find /proc/partitions files\n");
       }
       return part_num;
}int ADD_DEV(SCSI_USB_DEV * dev)
{
       if(f_first_dev)
       {
              dev->next_dev = f_first_dev;
              f_first_dev = dev;
       }
       else
       {
              f_first_dev = dev;
              dev->next_dev = NULL;
       }
       return 1;
}void find_device(){	char buf[1024];
       	int fd;
       	int len;
       	int dev_num = 0;
       	char * seek = NULL;
       	SCSI_USB_DEV * new_dev;
       	
       	CLEAR_DEV();
       	
       	fd = open(FILE_DEV_CHECK, O_RDONLY);	if(fd > 0)	{		len = read(fd, buf, sizeof(buf));
            	close(fd);
              	if ( len > 0 )
              	{
                     	seek = buf;
                     	while(seek)
                     	{
                            	seek = strstr(seek, "Host: scsi");
                            	if (seek)
                            	{
                                   	seek += strlen( "Host: scsi");
                                   	seek = strstr(seek, "Type:");
                                   	if (seek)
                                   	{
                                   	       seek += strlen("Type:");
                                   	       while(*seek == ' ') seek++;
                                   	       new_dev = malloc(sizeof(SCSI_USB_DEV));
                                   	       INIT_DEV(new_dev, dev_num, seek);
                                   	       ADD_DEV(new_dev);       
                                   	       dev_num ++;
                                   	}
                            	}
                     	}//while
                     printf("dev_num = %d\n", dev_num);
              }	}	else{		printf("error ! can't find /proc/scsi/scis file!\n");	}}int check_attach(SCSI_USB_DEV * dev)
{//检测设备是否连接
//linux中只要设备被插入过就会记住该设备
//只能通过Attached来判断是否连接 
       char buf[512];
       int fd;
       int len;
       char * seek;
       
       fd = open(dev->file_statu, O_RDONLY);
       if( fd > 0 )
       {
              len = read(fd, buf, sizeof(buf));
              close(fd);
              if ( len > 0 )
              {
                     seek = strstr(buf, "Attached:");
                     if (seek)
                     {
                            seek += strlen( "Attached:");
                            while(*seek == ' ') seek++;
                            return *seek=='Y';
                     }
              }
       }
       else
       {
              perror(dev->file_statu);
       }
       return 0;
}int do_mount(SCSI_USB_DEV * dev)
{
       int i = 0;
       char fstype[10];
       unsigned long mountflags=0;
       char mount_data[30];
       char tmpdir[50];
       

       if (dev->type == 2)
       {
              sprintf(tmpdir, USB_DISK_MP"/disk%d", dev->index);
              mkdir(tmpdir, 0777);
              
              strcpy(fstype, "vfat");
              mountflags= 0xc0ed0000;
              strcpy(mount_data,"codepage=936,iocharset=gb2312");
              
              if (dev->part_num > 1)
                     i ++; /*if disk ignore first part disc*/
              for(; i<dev->part_num; i++) /*if disk ignore first part disc*/
              {
                     mkdir(dev->mount_path[i], 0777);
                     if (mount(dev->devfile_parts[i], dev->mount_path[i], fstype ,mountflags, mount_data)== 0)
                     {
                            printf("mount %s %s success\n", dev->devfile_parts[i], dev->mount_path[i]);
                            //Do_USB_Disk_Update(dev->mount_path[i]);
                     }
                     else
                     {
                            rmdir(dev->mount_path[i]);
                            printf("mount %s %s failed\n", dev->devfile_parts[i], dev->mount_path[i]);
                     }
              }
       }
       else
       {
              return 0;
       }
       return 1;
}

static int do_umount(SCSI_USB_DEV * dev)
{
       int i = 0;
       char tmpdir[50];
 
       if(dev->type == 2) 
       {
              if (dev->part_num > 1)
                     i ++; /*if disk ignore first part disc*/
              for(; i<dev->part_num; i++)
              {
                     if (umount(dev->mount_path[i]) == 0)
                     {
                            printf("umount %s success\n", dev->devfile_parts[i]);
                            remove(dev->mount_path[i]);
                     }
                     else
                     {
                            printf("umount %s failed\n", dev->devfile_parts[i]);
                     }
              }
              sprintf(tmpdir, USB_DISK_MP"/disk%d", dev->index);
              remove(tmpdir);
       }
       return 1;
}



int check_mount(SCSI_USB_DEV * dev)
{
       char buf[1024];
       int fd;
       int len;
       char * seek;
       int i = 0;
       fd = open(FILE_MOUNT_CHECK, O_RDONLY);
       if( fd > 0 )
       {
              len = read(fd, buf, sizeof(buf));
              close(fd);
              if ( len > 0 )
              {
                     buf[len] = '\0';
                     if(dev->type == 2 && dev->part_num > 1) i ++; /*if disk ignore first part disc*/
                     for(; i<dev->part_num; i++)
                     {
                            seek = strstr(buf, dev->devfile_parts[i]);
                            if (seek!=NULL) return 1;/*have one part mounted return 1*/
                     }
              }
       }
       else
       {
              printf("error ! can't find /proc/mounts file!\n");
       }
       return 0;
}int process_dev(SCSI_USB_DEV * dev)
{
       if (check_attach(dev))//检测设备是否插上
       {
              if (!check_mount(dev))//检测设备是否mount上了
              {
                     do_mount(dev);
              }
       }
       else
       {
              if (check_mount(dev))
              {
                     do_umount(dev);
              }
       }
       return 1;
}int main(int argc , char **argv){	SCSI_USB_DEV * cur_dev = NULL;	mkdir(USB_DISK_MP, 0777);	while( 1 )	{		find_device();		cur_dev = f_first_dev;
              	while (cur_dev)
              	{
               	      process_dev(cur_dev);//对每个设备进行处理
               	      cur_dev = cur_dev->next_dev;
              	}		sleep(10);	}	return 0 ;}

⌨️ 快捷键说明

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