基于富瀚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;
}
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 : 128 GB
Sector size ( logical / physical ) : 512 B / 512 B
Partition Table : msdos
Disk Flags :
Number Start End Size Type File system Flags
1 16.8 MB 128 GB 128 GB 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 ;
}
源码下载
点这点这~~~