2b5b7da9f3
Add support for enabling multiple disk interfaces (Flash, RAM) simultaneously in Zephyr by introducing a simple disk interface framework where we can register multiple disks which would interface with different storage devices. This would enable us to have multiple instances of FATFS in Zephyr. Add support for mass storage drive disk name which will be used as an argument when calling the disk interface API's. Enable multiple volumes support configuration in ELM FAT library. Signed-off-by: Ramakrishna Pallala <ramakrishna.pallala@intel.com>
132 lines
3.4 KiB
C
132 lines
3.4 KiB
C
/*
|
|
* Copyright (c) 2016 Intel Corporation.
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
/**
|
|
* @file
|
|
* @brief Disk Access layer APIs and defines
|
|
*
|
|
* This file contains APIs for disk access. Apart from disks, various
|
|
* other storage media like Flash and RAM disks may implement this interface to
|
|
* be used by various higher layers(consumers) like USB Mass storage
|
|
* and Filesystems.
|
|
*/
|
|
|
|
#ifndef _DISK_ACCESS_H_
|
|
#define _DISK_ACCESS_H_
|
|
|
|
#include <kernel.h>
|
|
#include <zephyr/types.h>
|
|
#include <misc/dlist.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* Possible Cmd Codes for disk_ioctl() */
|
|
|
|
/* Get the number of sectors in the disk */
|
|
#define DISK_IOCTL_GET_SECTOR_COUNT 1
|
|
/* Get the size of a disk SECTOR in bytes */
|
|
#define DISK_IOCTL_GET_SECTOR_SIZE 2
|
|
/* How many sectors constitute a FLASH Erase block */
|
|
#define DISK_IOCTL_GET_ERASE_BLOCK_SZ 4
|
|
/* Commit any cached read/writes to disk */
|
|
#define DISK_IOCTL_CTRL_SYNC 5
|
|
|
|
/* 3 is reserved. It used to be DISK_IOCTL_GET_DISK_SIZE */
|
|
|
|
/* Possible return bitmasks for disk_status() */
|
|
#define DISK_STATUS_OK 0x00
|
|
#define DISK_STATUS_UNINIT 0x01
|
|
#define DISK_STATUS_NOMEDIA 0x02
|
|
#define DISK_STATUS_WR_PROTECT 0x04
|
|
|
|
struct disk_operations;
|
|
|
|
struct disk_info {
|
|
sys_dnode_t node;
|
|
char *name;
|
|
const struct disk_operations *ops;
|
|
};
|
|
|
|
struct disk_operations {
|
|
int (*init)(struct disk_info *disk);
|
|
int (*status)(struct disk_info *disk);
|
|
int (*read)(struct disk_info *disk, u8_t *data_buf,
|
|
u32_t start_sector, u32_t num_sector);
|
|
int (*write)(struct disk_info *disk, const u8_t *data_buf,
|
|
u32_t start_sector, u32_t num_sector);
|
|
int (*ioctl)(struct disk_info *disk, u8_t cmd, void *buff);
|
|
};
|
|
|
|
/*
|
|
* @brief perform any initialization
|
|
*
|
|
* This call is made by the consumer before doing any IO calls so that the
|
|
* disk or the backing device can do any initialization.
|
|
*
|
|
* @return 0 on success, negative errno code on fail
|
|
*/
|
|
int disk_access_init(const char *pdrv);
|
|
|
|
/*
|
|
* @brief Get the status of disk
|
|
*
|
|
* This call is used to get the status of the disk
|
|
*
|
|
* @return DISK_STATUS_OK or other DISK_STATUS_*s
|
|
*/
|
|
int disk_access_status(const char *pdrv);
|
|
|
|
/*
|
|
* @brief read data from disk
|
|
*
|
|
* Function to read data from disk to a memory buffer.
|
|
*
|
|
* @param[in] data_buf Pointer to the memory buffer to put data.
|
|
* @param[in] start_sector Start disk sector to read from
|
|
* @param[in] num_sector Number of disk sectors to read
|
|
*
|
|
* @return 0 on success, negative errno code on fail
|
|
*/
|
|
int disk_access_read(const char *pdrv, u8_t *data_buf,
|
|
u32_t start_sector, u32_t num_sector);
|
|
|
|
/*
|
|
* @brief write data to disk
|
|
*
|
|
* Function write data from memory buffer to disk.
|
|
*
|
|
* @param[in] data_buf Pointer to the memory buffer
|
|
* @param[in] start_sector Start disk sector to write to
|
|
* @param[in] num_sector Number of disk sectors to write
|
|
*
|
|
* @return 0 on success, negative errno code on fail
|
|
*/
|
|
int disk_access_write(const char *pdrv, const u8_t *data_buf,
|
|
u32_t start_sector, u32_t num_sector);
|
|
|
|
/*
|
|
* @brief Get/Configure disk parameters
|
|
*
|
|
* Function to get disk parameters and make any special device requests.
|
|
*
|
|
* @param[in] cmd DISK_IOCTL_* code describing the request
|
|
*
|
|
* @return 0 on success, negative errno code on fail
|
|
*/
|
|
int disk_access_ioctl(const char *pdrv, u8_t cmd, void *buff);
|
|
|
|
int disk_access_register(struct disk_info *disk);
|
|
|
|
int disk_access_unregister(struct disk_info *disk);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* _DISK_ACCESS_H_ */
|