通过获取系统的基本分区信息解析PARTNAME信息,找到对应block命名的分区信息, 这样可以方便以后调整分区大小后, 在裸操作FLASH的时候不用重新修改分区的起始地址和大小
<pre name="code" class="cpp">FILE *fp;
/* 打开分区信息文件
cat /proc/partitions
major minor #blocks name
179 0 7634944 mmcblk0
179 1 4096 mmcblk0p1
179 2 4096 mmcblk0p2
179 3 4096 mmcblk0p3
179 4 16384 mmcblk0p4
179 5 24576 mmcblk0p5
179 6 4096 mmcblk0p6
179 7 12288 mmcblk0p7
259 0 4096 mmcblk0p8
259 1 8192 mmcblk0p9
259 2 4096 mmcblk0p10
259 3 4096 mmcblk0p11
259 4 4096 mmcblk0p12
259 5 32768 mmcblk0p13
259 6 4096 mmcblk0p14
259 7 8192 mmcblk0p15
259 8 36864 mmcblk0p16
259 9 16384 mmcblk0p17
259 10 524288 mmcblk0p18
259 11 2310144 mmcblk0p19
259 12 307200 mmcblk0p20
259 13 4096000 mmcblk0p21
179 16 4096 mmcblk0boot1
179 8 4096 mmcblk0boot0
*/
if ((fp = fopen("/proc/partitions","r")) == NULL)
return SK_FAILED;
char name[SK_MTD_NAME_SIZE]={'\0'};
fscanf( fp, "%*s %*s %*s %s\n",name );//跳过第1行
while ( fscanf( fp, "%*d %*d %*d %s\n",name )>=0) /*解析读取的参数, 例如 将mmcblk0 传给参数 name */
{
//name is mmcblk0p7
FILE *stream=NULL;
#define SZ_OUT (100)
char read_buf[SZ_OUT]={0};
char file_read[100]={'\0'};
/* 根据前面获取到的name参数, 获取uevent
# cat sys/block/mmcblk0/mmcblk0p1/uevent
MAJOR=179
MINOR=1
DEVNAME=mmcblk0p1
DEVTYPE=partition
PARTN=1
PARTNAME=boot
*/
snprintf(file_read,sizeof(file_read),"/sys/block/mmcblk0/%s/uevent",name);
/*
cat /sys/block/mmcblk0/mmcblk0p7/uevent
*/
stream = fopen( file_read , "r" );
if(stream==NULL)
{
SK_ERROR(("fopen :%s fail",file_read));
continue;
}
fread( read_buf, sizeof(char), SZ_OUT, stream);
fclose(stream);
char PARTNAME[128]={'\0'};
char *p_found=NULL;
if((p_found=strstr( read_buf, "PARTNAME="))!=NULL)
{
if(sscanf( p_found,"PARTNAME=%s\n",&PARTNAME[0])>=0)
{
if(strncmp(PARTNAME,SK_HDI_E2P_DEV_NAME,strlen(SK_HDI_E2P_DEV_NAME))==0)
{
snprintf(partition_name,SK_MTD_NAME_SIZE,DIRNAME_MMC"%s",name);
/*
cat /sys/block/mmcblk0/mmcblk0p7/size
*/
memset(file_read,0,sizeof(file_read));
snprintf(file_read,sizeof(file_read),"/sys/block/mmcblk0/%s/size",name);
stream = fopen( file_read , "r" );
if(stream==NULL)
{
SK_ERROR(("fopen :%s fail",file_read));
memset(partition_name,0, strlen(partition_name));
*partition_size=0;
fclose(fp);
return -1;
}
fread( read_buf, sizeof(char), SZ_OUT, stream);
fclose(stream);
if(sscanf( read_buf,"%lu\n",partition_size)>=0)
{
*partition_size *= 512;
SK_INFO(("partition_size: %lu MB",*partition_size/1024/1024));
}
else
{
SK_ERROR(("sscanf fail"));
memset(partition_name,0, strlen(partition_name));
*partition_size=0;
fclose(fp);
return -1;
}
}
}
else
{
SK_ERROR(("no PARTNAME\n"));
fclose(fp);
return -1;
}
}
}
fclose(fp);
return 0;