uboot/drivers/dfu/dfu_ram.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0+
   2/*
   3 * (C) Copyright 2013
   4 * Afzal Mohammed <afzal.mohd.ma@gmail.com>
   5 *
   6 * Reference: dfu_mmc.c
   7 * Copyright (C) 2012 Samsung Electronics
   8 * author: Lukasz Majewski <l.majewski@samsung.com>
   9 */
  10
  11#include <common.h>
  12#include <malloc.h>
  13#include <errno.h>
  14#include <dfu.h>
  15
  16static int dfu_transfer_medium_ram(enum dfu_op op, struct dfu_entity *dfu,
  17                                   u64 offset, void *buf, long *len)
  18{
  19        if (dfu->layout != DFU_RAM_ADDR) {
  20                pr_err("unsupported layout: %s\n", dfu_get_layout(dfu->layout));
  21                return  -EINVAL;
  22        }
  23
  24        if (offset > dfu->data.ram.size) {
  25                pr_err("request exceeds allowed area\n");
  26                return -EINVAL;
  27        }
  28
  29        if (op == DFU_OP_WRITE)
  30                memcpy(dfu->data.ram.start + offset, buf, *len);
  31        else
  32                memcpy(buf, dfu->data.ram.start + offset, *len);
  33
  34        return 0;
  35}
  36
  37static int dfu_write_medium_ram(struct dfu_entity *dfu, u64 offset,
  38                                void *buf, long *len)
  39{
  40        return dfu_transfer_medium_ram(DFU_OP_WRITE, dfu, offset, buf, len);
  41}
  42
  43int dfu_get_medium_size_ram(struct dfu_entity *dfu, u64 *size)
  44{
  45        *size = dfu->data.ram.size;
  46
  47        return 0;
  48}
  49
  50static int dfu_read_medium_ram(struct dfu_entity *dfu, u64 offset,
  51                               void *buf, long *len)
  52{
  53        return dfu_transfer_medium_ram(DFU_OP_READ, dfu, offset, buf, len);
  54}
  55
  56int dfu_fill_entity_ram(struct dfu_entity *dfu, char *devstr, char *s)
  57{
  58        const char *argv[3];
  59        const char **parg = argv;
  60
  61        for (; parg < argv + sizeof(argv) / sizeof(*argv); ++parg) {
  62                *parg = strsep(&s, " ");
  63                if (*parg == NULL) {
  64                        pr_err("Invalid number of arguments.\n");
  65                        return -ENODEV;
  66                }
  67        }
  68
  69        dfu->dev_type = DFU_DEV_RAM;
  70        if (strcmp(argv[0], "ram")) {
  71                pr_err("unsupported device: %s\n", argv[0]);
  72                return -ENODEV;
  73        }
  74
  75        dfu->layout = DFU_RAM_ADDR;
  76        dfu->data.ram.start = (void *)simple_strtoul(argv[1], NULL, 16);
  77        dfu->data.ram.size = simple_strtoul(argv[2], NULL, 16);
  78
  79        dfu->write_medium = dfu_write_medium_ram;
  80        dfu->get_medium_size = dfu_get_medium_size_ram;
  81        dfu->read_medium = dfu_read_medium_ram;
  82
  83        dfu->inited = 0;
  84
  85        return 0;
  86}
  87