aboutsummaryrefslogtreecommitdiff
path: root/libflash
diff options
context:
space:
mode:
Diffstat (limited to 'libflash')
-rw-r--r--libflash/file_flash.c224
-rw-r--r--libflash/file_flash.h11
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 */