Line data Source code
1 1 : /* 2 : * Copyright (c) 2016 Intel Corporation. 3 : * Copyright (c) 2021 Nordic Semiconductor ASA 4 : * 5 : * SPDX-License-Identifier: Apache-2.0 6 : */ 7 : 8 : /** 9 : * @file 10 : * @brief Disk Driver Interface 11 : * 12 : * This file contains interface for disk access. Apart from disks, various 13 : * other storage media like Flash and RAM disks may implement this interface to 14 : * be used by various higher layers(consumers) like USB Mass storage 15 : * and Filesystems. 16 : */ 17 : 18 : #ifndef ZEPHYR_INCLUDE_DRIVERS_DISK_H_ 19 : #define ZEPHYR_INCLUDE_DRIVERS_DISK_H_ 20 : 21 : /** 22 : * @brief Disk Driver Interface 23 : * @defgroup disk_driver_interface Disk Driver Interface 24 : * @since 1.6 25 : * @version 1.0.0 26 : * @ingroup io_interfaces 27 : * @{ 28 : */ 29 : 30 : #include <zephyr/kernel.h> 31 : #include <zephyr/types.h> 32 : #include <zephyr/sys/dlist.h> 33 : 34 : #ifdef __cplusplus 35 : extern "C" { 36 : #endif 37 : 38 : /** 39 : * @brief Possible Cmd Codes for disk_ioctl() 40 : */ 41 : 42 : /** Get the number of sectors in the disk */ 43 1 : #define DISK_IOCTL_GET_SECTOR_COUNT 1 44 : /** Get the size of a disk SECTOR in bytes */ 45 1 : #define DISK_IOCTL_GET_SECTOR_SIZE 2 46 : /** reserved. It used to be DISK_IOCTL_GET_DISK_SIZE */ 47 1 : #define DISK_IOCTL_RESERVED 3 48 : /** How many sectors constitute a FLASH Erase block */ 49 1 : #define DISK_IOCTL_GET_ERASE_BLOCK_SZ 4 50 : /** Commit any cached read/writes to disk */ 51 1 : #define DISK_IOCTL_CTRL_SYNC 5 52 : /** Initialize the disk. This IOCTL must be issued before the disk can be 53 : * used for I/O. It is reference counted, so only the first successful 54 : * invocation of this macro on an uninitialized disk will initialize the IO 55 : * device 56 : */ 57 1 : #define DISK_IOCTL_CTRL_INIT 6 58 : /** Deinitialize the disk. This IOCTL can be used to de-initialize the disk, 59 : * enabling it to be removed from the system if the disk is hot-pluggable. 60 : * Disk usage is reference counted, so for a given disk the 61 : * `DISK_IOCTL_CTRL_DEINIT` IOCTL must be issued as many times as the 62 : * `DISK_IOCTL_CTRL_INIT` IOCTL was issued in order to de-initialize it. 63 : * 64 : * This macro optionally accepts a pointer to a boolean as the `buf` parameter, 65 : * which if true indicates the disk should be forcibly stopped, ignoring all 66 : * reference counts. The disk driver must report success if a forced stop is 67 : * requested, but this operation is inherently unsafe. 68 : */ 69 1 : #define DISK_IOCTL_CTRL_DEINIT 7 70 : 71 : /** 72 : * @brief Possible return bitmasks for disk_status() 73 : */ 74 : 75 : /** Disk status okay */ 76 1 : #define DISK_STATUS_OK 0x00 77 : /** Disk status uninitialized */ 78 1 : #define DISK_STATUS_UNINIT 0x01 79 : /** Disk status no media */ 80 1 : #define DISK_STATUS_NOMEDIA 0x02 81 : /** Disk status write protected */ 82 1 : #define DISK_STATUS_WR_PROTECT 0x04 83 : 84 : struct disk_operations; 85 : 86 : /** 87 : * @brief Disk info 88 : */ 89 1 : struct disk_info { 90 : /** Internally used list node */ 91 1 : sys_dnode_t node; 92 : /** Disk name */ 93 1 : const char *name; 94 : /** Disk operations */ 95 1 : const struct disk_operations *ops; 96 : /** Device associated to this disk */ 97 1 : const struct device *dev; 98 : /** Internally used disk reference count */ 99 1 : uint16_t refcnt; 100 : }; 101 : 102 : /** 103 : * @brief Disk operations 104 : */ 105 1 : struct disk_operations { 106 0 : int (*init)(struct disk_info *disk); 107 0 : int (*status)(struct disk_info *disk); 108 0 : int (*read)(struct disk_info *disk, uint8_t *data_buf, 109 : uint32_t start_sector, uint32_t num_sector); 110 0 : int (*write)(struct disk_info *disk, const uint8_t *data_buf, 111 : uint32_t start_sector, uint32_t num_sector); 112 0 : int (*ioctl)(struct disk_info *disk, uint8_t cmd, void *buff); 113 : }; 114 : 115 : /** 116 : * @brief Register disk 117 : * 118 : * @param[in] disk Pointer to the disk info structure 119 : * 120 : * @return 0 on success, negative errno code on fail 121 : */ 122 1 : int disk_access_register(struct disk_info *disk); 123 : 124 : /** 125 : * @brief Unregister disk 126 : * 127 : * @param[in] disk Pointer to the disk info structure 128 : * 129 : * @return 0 on success, negative errno code on fail 130 : */ 131 1 : int disk_access_unregister(struct disk_info *disk); 132 : 133 : #ifdef __cplusplus 134 : } 135 : #endif 136 : 137 : /** 138 : * @} 139 : */ 140 : 141 : #endif /* ZEPHYR_INCLUDE_DRIVERS_DISK_H_ */