分区自动识别判断

通过获取系统的基本分区信息解析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;

猜你喜欢

转载自blog.csdn.net/zmk0810612124/article/details/50618442