]>
git.ipfire.org Git - people/ms/u-boot.git/blob - drivers/dfu/dfu_ram.c
3 * Afzal Mohammed <afzal.mohd.ma@gmail.com>
6 * Copyright (C) 2012 Samsung Electronics
7 * author: Lukasz Majewski <l.majewski@samsung.com>
9 * SPDX-License-Identifier: GPL-2.0+
17 static int dfu_transfer_medium_ram(enum dfu_op op
, struct dfu_entity
*dfu
,
18 u64 offset
, void *buf
, long *len
)
20 if (dfu
->layout
!= DFU_RAM_ADDR
) {
21 pr_err("unsupported layout: %s\n", dfu_get_layout(dfu
->layout
));
25 if (offset
> dfu
->data
.ram
.size
) {
26 pr_err("request exceeds allowed area\n");
30 if (op
== DFU_OP_WRITE
)
31 memcpy(dfu
->data
.ram
.start
+ offset
, buf
, *len
);
33 memcpy(buf
, dfu
->data
.ram
.start
+ offset
, *len
);
38 static int dfu_write_medium_ram(struct dfu_entity
*dfu
, u64 offset
,
41 return dfu_transfer_medium_ram(DFU_OP_WRITE
, dfu
, offset
, buf
, len
);
44 int dfu_get_medium_size_ram(struct dfu_entity
*dfu
, u64
*size
)
46 *size
= dfu
->data
.ram
.size
;
51 static int dfu_read_medium_ram(struct dfu_entity
*dfu
, u64 offset
,
54 return dfu_transfer_medium_ram(DFU_OP_READ
, dfu
, offset
, buf
, len
);
57 int dfu_fill_entity_ram(struct dfu_entity
*dfu
, char *devstr
, char *s
)
60 const char **parg
= argv
;
62 for (; parg
< argv
+ sizeof(argv
) / sizeof(*argv
); ++parg
) {
63 *parg
= strsep(&s
, " ");
65 pr_err("Invalid number of arguments.\n");
70 dfu
->dev_type
= DFU_DEV_RAM
;
71 if (strcmp(argv
[0], "ram")) {
72 pr_err("unsupported device: %s\n", argv
[0]);
76 dfu
->layout
= DFU_RAM_ADDR
;
77 dfu
->data
.ram
.start
= (void *)simple_strtoul(argv
[1], NULL
, 16);
78 dfu
->data
.ram
.size
= simple_strtoul(argv
[2], NULL
, 16);
80 dfu
->write_medium
= dfu_write_medium_ram
;
81 dfu
->get_medium_size
= dfu_get_medium_size_ram
;
82 dfu
->read_medium
= dfu_read_medium_ram
;