• [基于富瀚6630平台实现U盘热插拔检测并mount]


    识别U盘线程_thread_HotplugEvent

    while(1)
    {
    	if (poll(stPoll, 1, 200) > 0)
    	{
    		//插上u盘会come here
    		if (stPoll[0].revents)
    		{
    			//MSG_WAITALL当没收到指定字节会阻塞等待
    			if( recv(hotplug_sock, buf, sizeof(buf), MSG_WAITALL) > 0 )
    			{
    				//通过接受内核socket传来的事件信息,获取u盘的设备路径和名称
    				//printf("%s\n", buf);
    				char *p = strstr(buf, "add@");
    				if(p)
    				{
    					p = strstr(p, "block/sd");
    					if (p)
    					{
    						int len = strlen("block/sd");
    						char cDisk = p[len];
    						if(cDisk >= 'a' && cDisk <= 'z' && p[len+1]==0)
    						{
    							char name[32];
    							snprintf(name,sizeof(name), "/dev/sd%c", cDisk);
    
    							//有的移动硬盘,在系统负载大的时候,/dev/sdb出现的比较慢,arch_is_file_exist返回-1,导致加载不上。
    							//所以这里sleep一下才行。
    							sleep(1);	
    							_AddDevice(name,MDISK_TYPE_COMMON);
    						}
    					}
    				}
    				else if( (p=strstr(buf,"remove@")) != NULL)
    				{
    					p = strstr(p, "block/sd");
    					if (p)
    					{
    						int len = strlen("block/sd");
    						char cDisk = p[len];
    						if(cDisk >= 'a' && cDisk <= 'z' && p[len+1]==0)
    						{
    							char name[32];
    							snprintf(name,sizeof(name), "/dev/sd%c", cDisk);
    
    							_RemoveDevice(name,JTRUE);
    						}
    					}
    				}
    			}
    		}
    	}
    	usleep(100000);
    	
    }
    printf("hotplug thread quit\n");
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55

    _AddDevice添加u盘设备

    //检查设备文件是否存在
    if(!arch_is_file_exist(diskName))
    {
    	printf("Add Device:%s fail, can't find\n", diskName);
    	return -1;
    }
    
    //判断是硬盘还是U盘
    arch_mutex_lock(sDisk_mutex);
    int bUDisk = _is_disk_removable(diskName,type);
    printf("add device:%s,type=%d,bUDisk:%d\n", diskName,type,bUDisk);
    if(1 == bUDisk)//U盘
    {
    	printf("[lxr_test_disk][func=%s][LINE=%d][diskName=%s]\n",__func__,__LINE__,diskName);
    	ret = _mdisk_add_udisk(diskName);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    char cDisk='z';
    sscanf(diskName, "/dev/sd%c", &cDisk);
    
    char name[64]={0};
    
    if(type == MDISK_TYPE_RAID)
    {
    	return FY_FALSE;
    }
    /*
    /mnt # cat /sys/block/sdf/removable 
    1
    */
    snprintf(name, sizeof(name),"/sys/block/sd%c/removable", cDisk);
    int fd = open(name, O_RDONLY);
    
    if(fd > 0)
    {
    	char info[4] = {0};
    	read(fd, info, 1);
    	close(fd);
    
    
    	if(info[0]=='1')
    		return FY_TRUE;
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    mount U盘设备

    //获取硬盘信息
    MDisk_t udisk;
    int rr = _ReadUDiskInfo(diskName, &udisk);
    if(rr < 0)
    {
    	printf("add:%s fail: get info fail\n", diskName);
    	return -1;
    }
    
    //更新U盘序号
    udisk.index = JVector_Cnt(sUdisk_vector);
    
    //保存信息
    int ret = 0;
    int iDisk = JVector_Cnt(sUdisk_vector);
    if(MDISK_STATUS_NORMAL == udisk.status)
    {
    	JVector_Append(sUdisk_vector, &udisk);
    	int cnt = JVector_Cnt(sUdisk_vector);
    	MDisk_t *p = JVector_At(sUdisk_vector, cnt-1);
    	printf("[lxr_test_disk][func=%s][LINE=%d]\n",__func__,__LINE__);
    	//挂载U盘
    	_MountUdisk(p);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    //使用fdisk获取磁盘的信息
    /*
    /mnt # parted /dev/sdf -s print
    Model: Generic MassStorageClass (scsi)
    Disk /dev/sdf: 128GB
    Sector size (logical/physical): 512B/512B
    Partition Table: msdos
    Disk Flags: 
    
    Number  Start   End    Size   Type     File system  Flags
    1      16.8MB  128GB  128GB  primary  fat32
    */
    snprintf(strCmd ,sizeof(strCmd), "parted %s -s print" , diskName);
    
    FILE * fp;
    fp = popen(strCmd, "r");//把strCmd命令反馈的信息填入到buffer里
    
    fread(strResult,4096,1,fp);
    pclose(fp);
    
    printf("parted result:%s\n", strResult);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    int i;
    	int ret = 0;
    	int nMountPoint=0;	//挂载点
    	unsigned int total = 0;
    	for(i=0; i<udisk->partionTable.cntPartion; i++)
    	{
    		Partion_t *partion = &udisk->partionTable.partion[i];
    
    		if(partion->type != MDISK_PARTION_FAT )
    			continue;
    
    		//建立挂载点
    		snprintf(partion->mountPoint,sizeof(partion->mountPoint), "%s/%02d", udisk->mountPoint, nMountPoint);
    		nMountPoint++;
    
    		//如果挂载点不存在则创建
    		if(!arch_is_file_exist(partion->mountPoint))
    		{
    			arch_mkdir_p(partion->mountPoint);
    		}
    
    		//挂载
    		char strCmd[128]= {0};
    		char charset[64] = "";
    
    	
    		if (partion->type == MDISK_PARTION_FAT)
    		{
    	#if SUPPORT_ASYNC
    			snprintf(strCmd ,sizeof(strCmd), "mount -t vfat %s %s %s", charset, partion->device, partion->mountPoint);
    	#else
    			snprintf(strCmd ,sizeof(strCmd), "mount -t vfat -o sync %s %s %s", charset, partion->device, partion->mountPoint);
    	#endif
    		}
    			
    		printf("%s\n",strCmd);
    		system(strCmd);
    		//if(!utl_system_is_success(rr))
    		if(!arch_is_mounted(partion->mountPoint))	//这里不判断IsSystemFail,因为有可能已经挂载了。
    		{
    			printf("cmd:%s failed,ret=%d\n", strCmd, -1);
    			ret = -5;
    			partion->mountPoint[0] = 0;
    			break;
    		}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    源码下载

    点这点这~~~

  • 相关阅读:
    基于微信公众号的图书借阅平台设计与实现
    网络钓鱼攻击飙升,265个品牌在2022年上半年被冒充
    C++中的智能指针:更安全、更便利的内存管理
    hi3559AV100调试记录
    Jetson Xavier NX 平台gstreamer elements 在Jetpack 5.0.2更慢比Jetpack 4.6
    RabbitMQ--基础--01--介绍
    嵌入式开发:加速物联网设备的开发
    基于java+SpringBoot+HTML+Mysql基于WEB技术的教学评估管理系统
    Java使用动态规划算法思想解决01背包问题
    GO的简单入门:使用Go和Gin开发一个RESTFulAPI
  • 原文地址:https://blog.csdn.net/a812417530/article/details/126345578