[基于富瀚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");

_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);
}
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;

}

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);
}
//使用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);
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;
		}

源码下载

点这点这~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

I&You

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值