diff options
Diffstat (limited to 'libflash')
-rw-r--r-- | libflash/file_flash.c | 224 | ||||
-rw-r--r-- | libflash/file_flash.h | 11 |
2 files changed, 0 insertions, 235 deletions
diff --git a/libflash/file_flash.c b/libflash/file_flash.c deleted file mode 100644 index d902672..0000000 --- a/libflash/file_flash.c +++ /dev/null @@ -1,224 +0,0 @@ -#include <unistd.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <stdbool.h> -#include <stdlib.h> -#include <sys/ioctl.h> -#include <sys/mman.h> -#include <string.h> - -#include <mtd/mtd-abi.h> - -#include "file_flash.h" - -/* The caller is going to have to supply this */ -struct file_flash_priv { - int fd; -}; - -/* - * Unfortunately not all file descriptors are created equal... - * Here we check to see if the file descriptor is to an MTD device, in which - * case we have to get the size of it differently. - */ -int file_setup(struct spi_flash_ctrl *ctrl, uint32_t *tsize) -{ - struct mtd_info_user mtd_info; - struct file_flash_priv *file_flash_data; - struct stat sbuf; - - if (!ctrl || !ctrl->priv) - return -1; - - file_flash_data = (struct file_flash_priv *)ctrl->priv; - - if (fstat(file_flash_data->fd, &sbuf) == -1) - return -1; - - if (S_ISCHR(sbuf.st_mode)) { - if (ioctl(file_flash_data->fd, MEMGETINFO, &mtd_info) == -1) - return -1; - - ctrl->finfo->size = mtd_info.size; - - } else if (S_ISREG(sbuf.st_mode)) { - ctrl->finfo->size = sbuf.st_size; - - } else { - /* Not going to be able to work with anything else */ - return -1; - } - - if (tsize) - *tsize = ctrl->finfo->size; - - return 0; -} - -int file_set4b(struct spi_flash_ctrl *ctrl, bool enable) -{ - /* Always report success no matter what, this isn't relevent for files */ - return 0; -} - -int file_chipid(struct spi_flash_ctrl *ctrl, uint8_t *id_buf, - uint32_t *id_size) -{ - if (!ctrl || !ctrl->priv || !id_size || *id_size < 3) - return -1; - - id_buf[0] = 'M'; - id_buf[1] = 'T'; - id_buf[2] = 'D'; - - *id_size = 3; - return 0; -} - -int file_read(struct spi_flash_ctrl *ctrl, uint32_t addr, void *buf, - uint32_t size) -{ - int rc; - struct file_flash_priv *file_flash_data; - - if (!ctrl || !ctrl->priv) - return -1; - - file_flash_data = (struct file_flash_priv *)ctrl->priv; - - rc = lseek(file_flash_data->fd, addr, SEEK_SET); - if ((off_t )rc == (off_t )-1) - return -1; - - rc = read(file_flash_data->fd, buf, size); - if (rc == -1) - return -1; - /* TODO Perhaps deal with short reads */ - - return 0; -} - -int file_write(struct spi_flash_ctrl *ctrl, uint32_t addr, - const void *buf, uint32_t size) -{ - size_t rc; - struct file_flash_priv *file_flash_data; - - if (!ctrl || !ctrl->priv) - return -1; - - file_flash_data = (struct file_flash_priv *)ctrl->priv; - - rc = lseek(file_flash_data->fd, addr, SEEK_SET); - if ((off_t )rc == (off_t )-1) - return -1; - - rc = write(file_flash_data->fd, buf, size); - if (rc != size) - return -1; - /* TODO Perhaps deal with short writes */ - - return 0; -} - -int file_erase(struct spi_flash_ctrl *ctrl, uint32_t addr, - uint32_t size) -{ - struct stat sbuf; - struct file_flash_priv *file_flash_data; - uint32_t esize; - - if (!ctrl || !ctrl->priv) - return -1; - - /* - * Input params addr = 0 and size = 0xffffffff mean libflash is telling us - * to erase the entire thing. - */ - file_flash_data = (struct file_flash_priv *)ctrl->priv; - - esize = (size == 0xffffffff && addr == 0) ? ctrl->finfo->size : size; - if (esize > ctrl->finfo->size) - return -1; - - if (fstat(file_flash_data->fd, &sbuf) == -1) - return -1; - - /* - * If we're dealing with an MTD device then its possible that there is a - * real flash device somewhere (as opposed to a regular file where the - * assumption is that there is not). - * In that case lets try to represerve that idea and use the erase ioctl. - */ - if (S_ISCHR(sbuf.st_mode)) { - struct erase_info_user erase_info = { - .start = addr, - .length = esize - }; - - if (ioctl(file_flash_data->fd, MEMERASE, erase_info) == -1) - return -1; - - } else if (S_ISREG(sbuf.st_mode)) { - /* Regular file, erase is just write zeros */ - char *section; - - section = mmap(NULL, sbuf.st_size, PROT_READ | PROT_WRITE, MAP_SHARED, file_flash_data->fd, 0); - if (section == (void *)-1) - return -1; - bzero(section + addr, esize); - if (munmap(section, sbuf.st_size) == -1) - return -1; - - } else { - return -1; - } - - return 0; -} - -/* To be called by tools wanting to use the libflash/libffs APIs */ -struct spi_flash_ctrl *build_flash_ctrl(int fd) -{ - struct spi_flash_ctrl *ctrl; - struct file_flash_priv *data; - - ctrl = calloc(1, sizeof(struct spi_flash_ctrl)); - if (!ctrl) - return NULL; - - data = calloc(1, sizeof(struct file_flash_priv)); - if (!data) { - free(ctrl); - return NULL; - } - - data->fd = fd; - - /* - * Don't implement the low level interfaces because we aren't flash. This - * will also force libflash to only call us with the high level interface. - */ - ctrl->cmd_rd = NULL; - ctrl->cmd_wr = NULL; - - /* - * Do implement everything else. - */ - ctrl->erase = &file_erase; - ctrl->write = &file_write; - ctrl->read = &file_read; - ctrl->chip_id = &file_chipid; - ctrl->set_4b = &file_set4b; - ctrl->setup = &file_setup; - - ctrl->priv = data; - - return ctrl; -} - -void free_flash_ctrl(struct spi_flash_ctrl *flash_ctrl) -{ - free(flash_ctrl->priv); - free(flash_ctrl); -} diff --git a/libflash/file_flash.h b/libflash/file_flash.h deleted file mode 100644 index dc6b5d7..0000000 --- a/libflash/file_flash.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef __FILE_FLASH_H -#define __FILE_FLASH_H - -#include <libflash/libflash.h> -#include <libflash/libflash-priv.h> - -struct spi_flash_ctrl *build_flash_ctrl(int fd); - -void free_flash_ctrl(struct spi_flash_ctrl *flash_ctrl); - -#endif /* __FILE_FLASH_H */ |