1 /* 2 * Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved. 3 * Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without modification, 6 * are permitted provided that the following conditions are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright notice, this list of 9 * conditions and the following disclaimer. 10 * 11 * 2. Redistributions in binary form must reproduce the above copyright notice, this list 12 * of conditions and the following disclaimer in the documentation and/or other materials 13 * provided with the distribution. 14 * 15 * 3. Neither the name of the copyright holder nor the names of its contributors may be used 16 * to endorse or promote products derived from this software without specific prior written 17 * permission. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 21 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 23 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 24 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 25 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 26 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 27 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 28 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 29 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32 /** 33 * @defgroup disk Disk 34 * @ingroup filesystem 35 */ 36 37 #ifndef _DISK_H 38 #define _DISK_H 39 40 #include "fs/driver.h" 41 #include "los_base.h" 42 #include "pthread.h" 43 44 #ifdef LOSCFG_FS_FAT_CACHE 45 #include "bcache.h" 46 #endif 47 48 #ifdef __cplusplus 49 #if __cplusplus 50 extern "C" { 51 #endif 52 #endif /* __cplusplus */ 53 54 #define SYS_MAX_DISK 5 55 #define MAX_DIVIDE_PART_PER_DISK 16 56 #define MAX_PRIMARY_PART_PER_DISK 4 57 #define SYS_MAX_PART (SYS_MAX_DISK * MAX_DIVIDE_PART_PER_DISK) 58 #define DISK_NAME 255 59 #define DISK_MAX_SECTOR_SIZE 512 60 61 #define PAR_OFFSET 446 /* MBR: Partition table offset (2) */ 62 #define BS_SIG55AA 510 /* Signature word (2) */ 63 #define BS_FILSYSTEMTYPE32 82 /* File system type (1) */ 64 #define BS_JMPBOOT 0 /* x86 jump instruction (3-byte) */ 65 #define BS_FILSYSTYPE 0x36 /* File system type (2) */ 66 #define BS_SIG55AA_VALUE 0xAA55 67 68 #define PAR_TYPE_OFFSET 4 69 #define PAR_START_OFFSET 8 70 #define PAR_COUNT_OFFSET 12 71 #define PAR_TABLE_SIZE 16 72 #define EXTENDED_PAR 0x0F 73 #define EXTENDED_8G 0x05 74 #define EMMC 0xEC 75 #define OTHERS 0x01 /* sdcard or umass */ 76 77 #define BS_FS_TYPE_MASK 0xFFFFFF 78 #define BS_FS_TYPE_VALUE 0x544146 79 #define BS_FS_TYPE_FAT 0x0B 80 #define BS_FS_TYPE_NTFS 0x07 81 82 #define FIRST_BYTE 1 83 #define SECOND_BYTE 2 84 #define THIRD_BYTE 3 85 #define FOURTH_BYTE 4 86 87 #define BIT_FOR_BYTE 8 88 89 #define LD_WORD_DISK(ptr) (UINT16)(((UINT16)*((UINT8 *)(ptr) + FIRST_BYTE) << (BIT_FOR_BYTE * FIRST_BYTE)) | \ 90 (UINT16)*(UINT8 *)(ptr)) 91 #define LD_DWORD_DISK(ptr) (UINT32)(((UINT32)*((UINT8 *)(ptr) + THIRD_BYTE) << (BIT_FOR_BYTE * THIRD_BYTE)) | \ 92 ((UINT32)*((UINT8 *)(ptr) + SECOND_BYTE) << (BIT_FOR_BYTE * SECOND_BYTE)) | \ 93 ((UINT16)*((UINT8 *)(ptr) + FIRST_BYTE) << (BIT_FOR_BYTE * FIRST_BYTE)) | \ 94 (*(UINT8 *)(ptr))) 95 96 #define LD_QWORD_DISK(ptr) ((UINT64)(((UINT64)LD_DWORD_DISK(&(ptr)[FOURTH_BYTE]) << (BIT_FOR_BYTE * FOURTH_BYTE)) | \ 97 LD_DWORD_DISK(ptr))) 98 99 /* Check VBR string, including FAT, NTFS */ 100 #define VERIFY_FS(ptr) (((LD_DWORD_DISK(&(ptr)[BS_FILSYSTEMTYPE32]) & BS_FS_TYPE_MASK) == BS_FS_TYPE_VALUE) || \ 101 !strncmp(&(ptr)[BS_FILSYSTYPE], "FAT", strlen("FAT")) || \ 102 !strncmp(&(ptr)[BS_JMPBOOT], "\xEB\x52\x90" "NTFS ", \ 103 strlen("\xEB\x52\x90" "NTFS "))) 104 105 #define PARTION_MODE_BTYE (PAR_OFFSET + PAR_TYPE_OFFSET) /* 0xEE: GPT(GUID), else: MBR */ 106 #define PARTION_MODE_GPT 0xEE /* 0xEE: GPT(GUID), else: MBR */ 107 #define SIGNATURE_OFFSET 0 /* The offset of GPT partition header signature */ 108 #define SIGNATURE_LEN 8 /* The length of GPT signature */ 109 #define HEADER_SIZE_OFFSET 12 /* The offset of GPT header size */ 110 #define TABLE_SIZE_OFFSET 84 /* The offset of GPT table size */ 111 #define TABLE_NUM_OFFSET 80 /* The number of GPT table */ 112 #define TABLE_START_SECTOR 2 113 #define TABLE_MAX_NUM 128 114 #define TABLE_SIZE 128 115 #define GPT_PAR_START_OFFSET 32 116 #define GPT_PAR_END_OFFSET 40 117 #define PAR_ENTRY_NUM_PER_SECTOR 4 118 #define HEADER_SIZE_MASK 0xFFFFFFFF 119 #define HEADER_SIZE 0x5C 120 #define HARD_DISK_GUID_OFFSET 56 121 #define HARD_DISK_GUID_FOR_ESP 0x0020004900460045 122 #define HARD_DISK_GUID_FOR_MSP 0x007200630069004D 123 #define PAR_VALID_OFFSET0 0 124 #define PAR_VALID_OFFSET1 4 125 #define PAR_VALID_OFFSET2 8 126 #define PAR_VALID_OFFSET3 12 127 128 #define VERIFY_GPT(ptr) ((!strncmp(&(ptr)[SIGNATURE_OFFSET], "EFI PART", SIGNATURE_LEN)) && \ 129 ((LD_DWORD_DISK(&(ptr)[HEADER_SIZE_OFFSET]) & HEADER_SIZE_MASK) == HEADER_SIZE)) 130 131 #define VERITY_PAR_VALID(ptr) ((LD_DWORD_DISK(&(ptr)[PAR_VALID_OFFSET0]) + \ 132 LD_DWORD_DISK(&(ptr)[PAR_VALID_OFFSET1]) + \ 133 LD_DWORD_DISK(&(ptr)[PAR_VALID_OFFSET2]) + \ 134 LD_DWORD_DISK(&(ptr)[PAR_VALID_OFFSET3])) != 0) 135 136 /* ESP MSP */ 137 #define VERITY_AVAILABLE_PAR(ptr) ((LD_QWORD_DISK(&(ptr)[HARD_DISK_GUID_OFFSET]) != HARD_DISK_GUID_FOR_ESP) && \ 138 (LD_QWORD_DISK(&(ptr)[HARD_DISK_GUID_OFFSET]) != HARD_DISK_GUID_FOR_MSP)) 139 140 /* Command code for disk_ioctrl function */ 141 /* Generic command (Used by FatFs) */ 142 #define DISK_CTRL_SYNC 0 /* Complete pending write process */ 143 #define DISK_GET_SECTOR_COUNT 1 /* Get media size */ 144 #define DISK_GET_SECTOR_SIZE 2 /* Get sector size */ 145 #define DISK_GET_BLOCK_SIZE 3 /* Get erase block size */ 146 #define DISK_CTRL_TRIM 4 /* Inform device that the data on the block of sectors is no longer used */ 147 148 /* Generic command (Not used by FatFs) */ 149 #define DISK_CTRL_POWER 5 /* Get/Set power status */ 150 #define DISK_CTRL_LOCK 6 /* Lock/Unlock media removal */ 151 #define DISK_CTRL_EJECT 7 /* Eject media */ 152 #define DISK_CTRL_FORMAT 8 /* Create physical format on the media */ 153 154 /* MMC/SDC specific ioctl command */ 155 #define DISK_MMC_GET_TYPE 10 /* Get card type */ 156 #define DISK_MMC_GET_CSD 11 /* Get CSD */ 157 #define DISK_MMC_GET_CID 12 /* Get CID */ 158 #define DISK_MMC_GET_OCR 13 /* Get OCR */ 159 #define DISK_MMC_GET_SDSTAT 14 /* Get SD status */ 160 161 /* ATA/CF specific ioctl command */ 162 #define DISK_ATA_GET_REV 20 /* Get F/W revision */ 163 #define DISK_ATA_GET_MODEL 21 /* Get model name */ 164 #define DISK_ATA_GET_SN 22 /* Get serial number */ 165 166 #ifndef LOSCFG_FS_FAT_CACHE 167 #define DISK_DIRECT_BUFFER_SIZE 4 /* los_disk direct io buffer when bcache is off */ 168 #endif 169 170 typedef enum _disk_status_ { 171 STAT_UNUSED, 172 STAT_INUSED, 173 STAT_UNREADY 174 } disk_status_e; 175 176 typedef struct _los_disk_ { 177 UINT32 disk_id : 8; /* physics disk number */ 178 UINT32 disk_status : 2; /* status of disk */ 179 UINT32 part_count : 8; /* current partition count */ 180 UINT32 reserved : 14; 181 struct Vnode *dev; /* device */ 182 #ifdef LOSCFG_FS_FAT_CACHE 183 OsBcache *bcache; /* cache of the disk, shared in all partitions */ 184 #endif 185 UINT32 sector_size; /* disk sector size */ 186 UINT64 sector_start; /* disk start sector */ 187 UINT64 sector_count; /* disk sector number */ 188 UINT8 type; 189 CHAR *disk_name; 190 LOS_DL_LIST head; /* link head of all the partitions */ 191 struct pthread_mutex disk_mutex; 192 #ifndef LOSCFG_FS_FAT_CACHE 193 UINT8 *buff; 194 #endif 195 } los_disk; 196 197 typedef struct _los_part_ { 198 UINT32 disk_id : 8; /* physics disk number */ 199 UINT32 part_id : 8; /* partition number in the system */ 200 UINT32 part_no_disk : 8; /* partition number in the disk */ 201 UINT32 part_no_mbr : 5; /* partition number in the mbr */ 202 UINT32 reserved : 3; 203 UINT8 filesystem_type; /* filesystem used in the partition */ 204 UINT8 type; 205 struct Vnode *dev; /* dev devices used in the partition */ 206 CHAR *part_name; 207 UINT64 sector_start; /* 208 * offset of a partition to the primary devices 209 * (multi-mbr partitions are seen as same parition) 210 */ 211 UINT64 sector_count; /* 212 * sector numbers of a partition. If there is no addpartition operation, 213 * then all the mbr devices equal to the primary device count. 214 */ 215 LOS_DL_LIST list; /* linklist of partition */ 216 } los_part; 217 218 struct partition_info { 219 UINT8 type; 220 UINT64 sector_start; 221 UINT64 sector_count; 222 }; 223 224 struct disk_divide_info { 225 UINT64 sector_count; 226 UINT32 sector_size; 227 UINT32 part_count; 228 /* 229 * The primary partition place should be reversed and set to 0 in case all the partitions are 230 * logical partition (maximum 16 currently). So the maximum part number should be 4 + 16. 231 */ 232 struct partition_info part[MAX_DIVIDE_PART_PER_DISK + MAX_PRIMARY_PART_PER_DISK]; 233 }; 234 235 /** 236 * @ingroup disk 237 * @brief Disk driver initialization. 238 * 239 * @par Description: 240 * Initializate a disk dirver, and set the block cache. 241 * 242 * @attention 243 * <ul> 244 * <li>The parameter diskName must point a valid string, which end with the terminating null byte.</li> 245 * <li>The total length of parameter diskName must be less than the value defined by PATH_MAX.</li> 246 * <li>The parameter bops must pointed the right functions, otherwise the system 247 * will crash when the disk is being operated.</li> 248 * <li>The parameter info can be null or point to struct disk_divide_info. when info is null, 249 * the disk will be divided base the information of MBR, otherwise, 250 * the disk will be divided base the information of parameter info.</li> 251 * </ul> 252 * 253 * @param diskName [IN] Type #const CHAR * disk driver name. 254 * @param bops [IN] Type #const struct block_operations * block driver control structure. 255 * @param priv [IN] Type #VOID * private data of vnode. 256 * @param diskID [IN] Type #INT32 disk id number, less than SYS_MAX_DISK. 257 * @param info [IN] Type #VOID * disk driver partition information. 258 * 259 * @retval #0 Initialization success. 260 * @retval #-1 Initialization failed. 261 * 262 * @par Dependency: 263 * <ul><li>disk.h</li></ul> 264 * @see los_disk_deinit 265 * 266 */ 267 INT32 los_disk_init(const CHAR *diskName, const struct block_operations *bops, 268 VOID *priv, INT32 diskID, VOID *info); 269 270 /** 271 * @ingroup disk 272 * @brief Destroy a disk driver. 273 * 274 * @par Description: 275 * Destroy a disk driver, free the dependent resource. 276 * 277 * @attention 278 * <ul> 279 * None 280 * </ul> 281 * 282 * @param diskID [IN] Type #INT32 disk driver id number, less than the value defined by SYS_MAX_DISK. 283 * 284 * @retval #0 Destroy success. 285 * @retval #-1 Destroy failed. 286 * 287 * @par Dependency: 288 * <ul><li>disk.h</li></ul> 289 * @see los_disk_init 290 * 291 */ 292 INT32 los_disk_deinit(INT32 diskID); 293 294 /** 295 * @ingroup disk 296 * @brief Read data from disk driver. 297 * 298 * @par Description: 299 * Read data from disk driver. 300 * 301 * @attention 302 * <ul> 303 * <li>The sector size of the disk to be read should be acquired by los_part_ioctl before calling this function.</li> 304 * <li>The parameter buf must point to a valid memory and the buf size is count * sector_size.</li> 305 * </ul> 306 * 307 * @param drvID [IN] Type #INT32 disk driver id number, less than the value defined by SYS_MAX_DISK. 308 * @param buf [OUT] Type #VOID * memory which used to store read data. 309 * @param sector [IN] Type #UINT64 expected start sector number to read. 310 * @param count [IN] Type #UINT32 expected sector count to read. 311 * @param useRead [IN] Type #BOOL set FALSE to use the write block for optimization 312 * 313 * @retval #0 Read success. 314 * @retval #-1 Read failed. 315 * 316 * @par Dependency: 317 * <ul><li>disk.h</li></ul> 318 * @see los_disk_write 319 * 320 */ 321 INT32 los_disk_read(INT32 drvID, VOID *buf, UINT64 sector, UINT32 count, BOOL useRead); 322 323 /** 324 * @ingroup disk 325 * @brief Write data to a disk driver. 326 * 327 * @par Description: 328 * Write data to a disk driver. 329 * 330 * @attention 331 * <ul> 332 * <li>The sector size of the disk to be read should be acquired by los_part_ioctl before calling this function.</li> 333 * <li>The parameter buf must point to a valid memory and the buf size is count * sector_size.</li> 334 * </ul> 335 * 336 * @param drvID [IN] Type #INT32 disk driver id number, less than the value defined by SYS_MAX_DISK. 337 * @param buf [IN] Type #const VOID * memory which used to storage write data. 338 * @param sector [IN] Type #UINT64 expected start sector number to read. 339 * @param count [IN] Type #UINT32 experted sector count of write. 340 * 341 * @retval #0 Write success. 342 * @retval #-1 Write failed. 343 * 344 * @par Dependency: 345 * <ul><li>disk.h</li></ul> 346 * @see los_disk_read 347 * 348 */ 349 INT32 los_disk_write(INT32 drvID, const VOID *buf, UINT64 sector, UINT32 count); 350 351 /** 352 * @ingroup disk 353 * @brief Get information of disk driver. 354 * 355 * @par Description: 356 * Get information of disk driver. 357 * 358 * @attention 359 * <ul> 360 * None 361 * </ul> 362 * 363 * @param drvID [IN] Type #INT32 disk driver id number, less than the value defined by SYS_MAX_DISK. 364 * @param cmd [IN] Type #INT32 command to issu, currently support GET_SECTOR_COUNT, GET_SECTOR_SIZE, 365 * GET_BLOCK_SIZE, CTRL_SYNC. 366 * @param buf [OUT] Type #VOID * memory to storage the information, the size must enough for data type(UINT64) 367 * when cmd type is DISK_GET_SECTOR_COUNT, others is size_t. 368 * 369 * @retval #0 Get information success. 370 * @retval #-1 Get information failed. 371 * 372 * @par Dependency: 373 * <ul><li>disk.h</li></ul> 374 * @see None 375 * 376 */ 377 INT32 los_disk_ioctl(INT32 drvID, INT32 cmd, VOID *buf); 378 379 /** 380 * @ingroup disk 381 * @brief Sync blib cache. 382 * 383 * @par Description: 384 * Sync blib cache, write the valid data to disk driver. 385 * 386 * @attention 387 * <ul> 388 * None 389 * </ul> 390 * 391 * @param drvID [IN] Type #INT32 disk driver id number, less than the value defined by SYS_MAX_DISK. 392 * 393 * @retval #0 Sync success. 394 * @retval #INT32 Sync failed. 395 * 396 * @par Dependency: 397 * <ul><li>disk.h</li></ul> 398 * @see None 399 * 400 */ 401 INT32 los_disk_sync(INT32 drvID); 402 403 /** 404 * @ingroup disk 405 * @brief Set blib cache for the disk driver. 406 * 407 * @par Description: 408 * Set blib cache for the disk driver, users can set the number of sectors of per block, 409 * and the number of blocks. 410 * 411 * @attention 412 * <ul> 413 * None 414 * </ul> 415 * 416 * @param drvID [IN] Type #INT32 disk driver id number, less than the value defined by SYS_MAX_DISK. 417 * @param sectorPerBlock [IN] Type #UINT32 sector number of per block, only can be 32 * (1, 2, ..., 8). 418 * @param blockNum [IN] Type #UINT32 block number of cache. 419 * 420 * @retval #0 Set success. 421 * @retval #INT32 Set failed. 422 * 423 * @par Dependency: 424 * <ul><li>disk.h</li></ul> 425 * @see None 426 * 427 */ 428 INT32 los_disk_set_bcache(INT32 drvID, UINT32 sectorPerBlock, UINT32 blockNum); 429 430 /** 431 * @ingroup disk 432 * @brief Read data from chosen partition. 433 * 434 * @par Description: 435 * Read data from chosen partition. 436 * 437 * @attention 438 * <ul> 439 * <li>The sector size of the disk to be read should be acquired by los_part_ioctl before calling this function.</li> 440 * <li>The parameter buf must point to valid memory and the buf size is count * sector_size.</li> 441 * </ul> 442 * 443 * @param pt [IN] Type #INT32 partition number, less than the value defined by SYS_MAX_PART. 444 * @param buf [OUT] Type #VOID * memory which used to store the data to be read. 445 * @param sector [IN] Type #UINT64 start sector number of chosen partition. 446 * @param count [IN] Type #UINT32 the expected sector count for reading. 447 * @param useRead [IN] Type #BOOL FALSE when reading large contiguous data, TRUE for other situations 448 * 449 * @retval #0 Read success. 450 * @retval #-1 Read failed. 451 * 452 * @par Dependency: 453 * <ul><li>disk.h</li></ul> 454 * @see los_part_read 455 * 456 */ 457 INT32 los_part_read(INT32 pt, VOID *buf, UINT64 sector, UINT32 count, BOOL useRead); 458 459 /** 460 * @ingroup disk 461 * @brief Write data to chosen partition. 462 * 463 * @par Description: 464 * Write data to chosen partition. 465 * 466 * @attention 467 * <ul> 468 * <li>The sector size of the disk to be write should be acquired by los_part_ioctl before calling this function.</li> 469 * <li>The parameter buf must point to valid memory and the buf size is count * sector_size.</li> 470 * </ul> 471 * 472 * @param pt [IN] Type #INT32 partition number,less than the value defined by SYS_MAX_PART. 473 * @param buf [IN] Type #VOID * memory which used to storage the written data. 474 * @param sector [IN] Type #UINT64 start sector number of chosen partition. 475 * @param count [IN] Type #UINT32 the expected sector count for write. 476 * 477 * @retval #0 Write success. 478 * @retval #-1 Write failed. 479 * 480 * @par Dependency: 481 * <ul><li>disk.h</li></ul> 482 * @see los_part_read 483 * 484 */ 485 INT32 los_part_write(INT32 pt, const VOID *buf, UINT64 sector, UINT32 count); 486 487 /** 488 * @ingroup disk 489 * @brief Clear the bcache data 490 * 491 * @par Description: 492 * Flush the data and mark the block as unused. 493 * 494 * @attention 495 * <ul> 496 * None 497 * </ul> 498 * 499 * @param drvID [IN] Type #INT32 disk id 500 * 501 * @retval #0 Write success. 502 * @retval #-1 Write failed. 503 * 504 * @par Dependency: 505 * <ul><li>disk.h</li></ul> 506 * @see los_part_read 507 * 508 */ 509 INT32 los_disk_cache_clear(INT32 drvID); 510 511 /** 512 * @ingroup disk 513 * @brief Get information of chosen partition. 514 * 515 * @par Description: 516 * By passed command to get information of chosen partition. 517 * 518 * @attention 519 * <ul> 520 * None 521 * </ul> 522 * 523 * @param pt [IN] Type #INT32 partition number,less than the value defined by SYS_MAX_PART. 524 * @param cmd [IN] Type #INT32 command to issu, currently support GET_SECTOR_COUNT, GET_SECTOR_SIZE, 525 * GET_BLOCK_SIZE, CTRL_SYNC. 526 * @param buf [OUT] Type #VOID * memory to store the information, the size must enough for data type (UINT64) 527 * when cmd type is DISK_GET_SECTOR_COUNT, others is size_t. 528 * 529 * @retval #0 Get information success. 530 * @retval #-1 Get information failed. 531 * 532 * @par Dependency: 533 * <ul><li>disk.h</li></ul> 534 * @see None 535 * 536 */ 537 INT32 los_part_ioctl(INT32 pt, INT32 cmd, VOID *buf); 538 539 /** 540 * @ingroup disk 541 * @brief Decide the chosen partition is exist or not. 542 * 543 * @par Description: 544 * Decide the chosen partition is exist or not. 545 * 546 * @attention 547 * <ul> 548 * <li>The parameter dev is a full path, which begin with '/' and end with '/0'.</li> 549 * </ul> 550 * 551 * @param dev [IN] Type #const CHAR * partition driver name. 552 * @param mode [IN] Type #mode_t access modd. 553 * 554 * @retval #0 The chosen partition is exist. 555 * @retval #-1 The chosen partition is not exist. 556 * 557 * @par Dependency: 558 * <ul><li>disk.h</li></ul> 559 * @see None 560 * 561 */ 562 INT32 los_part_access(const CHAR *dev, mode_t mode); 563 564 /** 565 * @ingroup disk 566 * @brief Find disk partition. 567 * 568 * @par Description: 569 * By driver partition vnode to find disk partition. 570 * 571 * @attention 572 * <ul> 573 * None 574 * </ul> 575 * 576 * @param blkDriver [IN] Type #struct Vnode * partition driver vnode. 577 * 578 * @retval #NULL Can't find chosen disk partition. 579 * @retval #los_part * This is partition structure pointer of chosen disk partition. 580 * 581 * @par Dependency: 582 * <ul><li>disk.h</li></ul> 583 * @see None 584 * 585 */ 586 los_part *los_part_find(struct Vnode *blkDriver); 587 588 /** 589 * @ingroup disk 590 * @brief Find disk driver. 591 * 592 * @par Description: 593 * By disk driver id number to find disk dirver. 594 * 595 * @attention 596 * <ul> 597 * None 598 * </ul> 599 * 600 * @param id [IN] Type #INT32 disk id number,less than the value defined by SYS_MAX_DISK. 601 * 602 * @retval #NULL Can't find chosen disk driver. 603 * @retval #los_disk * This is disk structure pointer of chosen disk driver. 604 * 605 * @par Dependency: 606 * <ul><li>disk.h</li></ul> 607 * @see None 608 * 609 */ 610 los_disk *get_disk(INT32 id); 611 612 /** 613 * @ingroup disk 614 * @brief Find disk partition. 615 * 616 * @par Description: 617 * By driver partition id number to find disk partition. 618 * 619 * @attention 620 * <ul> 621 * None 622 * </ul> 623 * 624 * @param id [IN] Type #INT32 partition id number,less than the value defined by SYS_MAX_PART. 625 * 626 * @retval #NULL Can't find chosen disk partition. 627 * @retval #los_part * This is partition structure pointer of chosen disk partition. 628 * 629 * @par Dependency: 630 * <ul><li>disk.h</li></ul> 631 * @see None 632 * 633 */ 634 los_part *get_part(INT32 id); 635 636 /** 637 * @ingroup disk 638 * @brief Print partition information. 639 * 640 * @par Description: 641 * Print partition information. 642 * 643 * @attention 644 * <ul> 645 * None 646 * </ul> 647 * 648 * @param part [IN] Type #los_part * partition control structure pointer 649 * 650 * @par Dependency: 651 * <ul><li>disk.h</li></ul> 652 * @see None 653 * 654 */ 655 VOID show_part(los_part *part); 656 657 /** 658 * @ingroup disk 659 * @brief Add a new mmc partition. 660 * 661 * @par Description: 662 * Add a new mmc partition, users can set the start sector and size of the new partition. 663 * 664 * @attention 665 * <ul> 666 * None 667 * </ul> 668 * 669 * @param info [IN] Type #struct disk_divide_info * Disk driver information structure pointer. 670 * @param sectorStart [IN] Type #size_t Start sector number of the new partition. 671 * @param sectorCount [IN] Type #size_t Sector count of the new partition. 672 * 673 * @retval #0 Add partition success. 674 * @retval #-1 Add partition failed. 675 * 676 * @par Dependency: 677 * <ul><li>disk.h</li></ul> 678 * @see None 679 * 680 */ 681 INT32 add_mmc_partition(struct disk_divide_info *info, size_t sectorStart, size_t sectorCount); 682 683 /** 684 * @ingroup disk 685 * @brief alloc a new UNUSED disk id. 686 * 687 * @par Description: 688 * Get a free disk id for new device. 689 * 690 * @attention 691 * <ul> 692 * <li>The parameter diskName must point a valid string, which end with the null byte ('\0') </li> 693 * <li>The total length of parameter diskName must be less than the value defined by DISK_NAME </li> 694 * </ul> 695 * 696 * @param diskName [IN] Type #const CHAR * device name. 697 * 698 * @retval #INT32 available disk id 699 * @retval #-1 alloc disk id failed 700 701 * @par Dependency: 702 * <ul><li>disk.h</li></ul> 703 * @see los_get_diskid_byname 704 * 705 */ 706 INT32 los_alloc_diskid_byname(const CHAR *diskName); 707 708 /** 709 * @ingroup disk 710 * @brief get the INUSED disk id. 711 * 712 * @par Description: 713 * Get the corresponding INUSED disk id by diskName. 714 * 715 * @attention 716 * <ul> 717 * <li>The parameter diskName must point a valid string, which end with the null byte ('\0') </li> 718 * <li>The total length of parameter diskName must be less than the value defined by DISK_NAME </li> 719 * </ul> 720 * 721 * @param diskName [IN] Type #const CHAR * device name. 722 * 723 * @retval #INT32 available disk id 724 * @retval #-1 get disk id failed 725 726 * @par Dependency: 727 * <ul><li>disk.h</li></ul> 728 * @see los_alloc_diskid_byname 729 * 730 */ 731 INT32 los_get_diskid_byname(const CHAR *diskName); 732 733 734 los_disk *los_get_mmcdisk_bytype(UINT8 type); 735 736 #ifdef __cplusplus 737 #if __cplusplus 738 } 739 #endif 740 #endif /* __cplusplus */ 741 742 #endif 743