uboot/include/dfu.h
<<
>>
Prefs
   1/*
   2 * dfu.h - DFU flashable area description
   3 *
   4 * Copyright (C) 2012 Samsung Electronics
   5 * authors: Andrzej Pietrasiewicz <andrzej.p@samsung.com>
   6 *          Lukasz Majewski <l.majewski@samsung.com>
   7 *
   8 * SPDX-License-Identifier:     GPL-2.0+
   9 */
  10
  11#ifndef __DFU_ENTITY_H_
  12#define __DFU_ENTITY_H_
  13
  14#include <common.h>
  15#include <linux/list.h>
  16#include <mmc.h>
  17#include <spi_flash.h>
  18#include <linux/usb/composite.h>
  19
  20enum dfu_device_type {
  21        DFU_DEV_MMC = 1,
  22        DFU_DEV_ONENAND,
  23        DFU_DEV_NAND,
  24        DFU_DEV_RAM,
  25        DFU_DEV_SF,
  26};
  27
  28enum dfu_layout {
  29        DFU_RAW_ADDR = 1,
  30        DFU_FS_FAT,
  31        DFU_FS_EXT2,
  32        DFU_FS_EXT3,
  33        DFU_FS_EXT4,
  34        DFU_RAM_ADDR,
  35};
  36
  37enum dfu_op {
  38        DFU_OP_READ = 1,
  39        DFU_OP_WRITE,
  40        DFU_OP_SIZE,
  41};
  42
  43struct mmc_internal_data {
  44        int dev_num;
  45
  46        /* RAW programming */
  47        unsigned int lba_start;
  48        unsigned int lba_size;
  49        unsigned int lba_blk_size;
  50
  51        /* eMMC HW partition access */
  52        int hw_partition;
  53
  54        /* FAT/EXT */
  55        unsigned int dev;
  56        unsigned int part;
  57};
  58
  59struct nand_internal_data {
  60        /* RAW programming */
  61        u64 start;
  62        u64 size;
  63
  64        unsigned int dev;
  65        unsigned int part;
  66        /* for nand/ubi use */
  67        unsigned int ubi;
  68};
  69
  70struct ram_internal_data {
  71        void            *start;
  72        unsigned int    size;
  73};
  74
  75struct sf_internal_data {
  76        struct spi_flash *dev;
  77
  78        /* RAW programming */
  79        u64 start;
  80        u64 size;
  81};
  82
  83#define DFU_NAME_SIZE                   32
  84#define DFU_CMD_BUF_SIZE                128
  85#ifndef CONFIG_SYS_DFU_DATA_BUF_SIZE
  86#define CONFIG_SYS_DFU_DATA_BUF_SIZE            (1024*1024*8)   /* 8 MiB */
  87#endif
  88#ifndef CONFIG_SYS_DFU_MAX_FILE_SIZE
  89#define CONFIG_SYS_DFU_MAX_FILE_SIZE CONFIG_SYS_DFU_DATA_BUF_SIZE
  90#endif
  91#ifndef DFU_DEFAULT_POLL_TIMEOUT
  92#define DFU_DEFAULT_POLL_TIMEOUT 0
  93#endif
  94#ifndef DFU_MANIFEST_POLL_TIMEOUT
  95#define DFU_MANIFEST_POLL_TIMEOUT       DFU_DEFAULT_POLL_TIMEOUT
  96#endif
  97
  98struct dfu_entity {
  99        char                    name[DFU_NAME_SIZE];
 100        int                     alt;
 101        void                    *dev_private;
 102        enum dfu_device_type    dev_type;
 103        enum dfu_layout         layout;
 104        unsigned long           max_buf_size;
 105
 106        union {
 107                struct mmc_internal_data mmc;
 108                struct nand_internal_data nand;
 109                struct ram_internal_data ram;
 110                struct sf_internal_data sf;
 111        } data;
 112
 113        long (*get_medium_size)(struct dfu_entity *dfu);
 114
 115        int (*read_medium)(struct dfu_entity *dfu,
 116                        u64 offset, void *buf, long *len);
 117
 118        int (*write_medium)(struct dfu_entity *dfu,
 119                        u64 offset, void *buf, long *len);
 120
 121        int (*flush_medium)(struct dfu_entity *dfu);
 122        unsigned int (*poll_timeout)(struct dfu_entity *dfu);
 123
 124        void (*free_entity)(struct dfu_entity *dfu);
 125
 126        struct list_head list;
 127
 128        /* on the fly state */
 129        u32 crc;
 130        u64 offset;
 131        int i_blk_seq_num;
 132        u8 *i_buf;
 133        u8 *i_buf_start;
 134        u8 *i_buf_end;
 135        long r_left;
 136        long b_left;
 137
 138        u32 bad_skip;   /* for nand use */
 139
 140        unsigned int inited:1;
 141};
 142
 143#ifdef CONFIG_SET_DFU_ALT_INFO
 144void set_dfu_alt_info(char *interface, char *devstr);
 145#endif
 146int dfu_config_entities(char *s, char *interface, char *devstr);
 147void dfu_free_entities(void);
 148void dfu_show_entities(void);
 149int dfu_get_alt_number(void);
 150const char *dfu_get_dev_type(enum dfu_device_type t);
 151const char *dfu_get_layout(enum dfu_layout l);
 152struct dfu_entity *dfu_get_entity(int alt);
 153char *dfu_extract_token(char** e, int *n);
 154void dfu_trigger_reset(void);
 155int dfu_get_alt(char *name);
 156int dfu_init_env_entities(char *interface, char *devstr);
 157unsigned char *dfu_get_buf(struct dfu_entity *dfu);
 158unsigned char *dfu_free_buf(void);
 159unsigned long dfu_get_buf_size(void);
 160bool dfu_usb_get_reset(void);
 161
 162int dfu_read(struct dfu_entity *de, void *buf, int size, int blk_seq_num);
 163int dfu_write(struct dfu_entity *de, void *buf, int size, int blk_seq_num);
 164int dfu_flush(struct dfu_entity *de, void *buf, int size, int blk_seq_num);
 165
 166/*
 167 * dfu_defer_flush - pointer to store dfu_entity for deferred flashing.
 168 *                   It should be NULL when not used.
 169 */
 170extern struct dfu_entity *dfu_defer_flush;
 171/**
 172 * dfu_get_defer_flush - get current value of dfu_defer_flush pointer
 173 *
 174 * @return - value of the dfu_defer_flush pointer
 175 */
 176static inline struct dfu_entity *dfu_get_defer_flush(void)
 177{
 178        return dfu_defer_flush;
 179}
 180
 181/**
 182 * dfu_set_defer_flush - set the dfu_defer_flush pointer
 183 *
 184 * @param dfu - pointer to the dfu_entity, which should be written
 185 */
 186static inline void dfu_set_defer_flush(struct dfu_entity *dfu)
 187{
 188        dfu_defer_flush = dfu;
 189}
 190
 191/**
 192 * dfu_write_from_mem_addr - write data from memory to DFU managed medium
 193 *
 194 * This function adds support for writing data starting from fixed memory
 195 * address (like $loadaddr) to dfu managed medium (e.g. NAND, MMC, file system)
 196 *
 197 * @param dfu - dfu entity to which we want to store data
 198 * @param buf - fixed memory addres from where data starts
 199 * @param size - number of bytes to write
 200 *
 201 * @return - 0 on success, other value on failure
 202 */
 203int dfu_write_from_mem_addr(struct dfu_entity *dfu, void *buf, int size);
 204
 205/* Device specific */
 206#ifdef CONFIG_DFU_MMC
 207extern int dfu_fill_entity_mmc(struct dfu_entity *dfu, char *devstr, char *s);
 208#else
 209static inline int dfu_fill_entity_mmc(struct dfu_entity *dfu, char *devstr,
 210                                      char *s)
 211{
 212        puts("MMC support not available!\n");
 213        return -1;
 214}
 215#endif
 216
 217#ifdef CONFIG_DFU_NAND
 218extern int dfu_fill_entity_nand(struct dfu_entity *dfu, char *devstr, char *s);
 219#else
 220static inline int dfu_fill_entity_nand(struct dfu_entity *dfu, char *devstr,
 221                                       char *s)
 222{
 223        puts("NAND support not available!\n");
 224        return -1;
 225}
 226#endif
 227
 228#ifdef CONFIG_DFU_RAM
 229extern int dfu_fill_entity_ram(struct dfu_entity *dfu, char *devstr, char *s);
 230#else
 231static inline int dfu_fill_entity_ram(struct dfu_entity *dfu, char *devstr,
 232                                      char *s)
 233{
 234        puts("RAM support not available!\n");
 235        return -1;
 236}
 237#endif
 238
 239#ifdef CONFIG_DFU_SF
 240extern int dfu_fill_entity_sf(struct dfu_entity *dfu, char *devstr, char *s);
 241#else
 242static inline int dfu_fill_entity_sf(struct dfu_entity *dfu, char *devstr,
 243                                     char *s)
 244{
 245        puts("SF support not available!\n");
 246        return -1;
 247}
 248#endif
 249
 250/**
 251 * dfu_tftp_write - Write TFTP data to DFU medium
 252 *
 253 * This function is storing data received via TFTP on DFU supported medium.
 254 *
 255 * @param dfu_entity_name - name of DFU entity to write
 256 * @param addr - address of data buffer to write
 257 * @param len - number of bytes
 258 * @param interface - destination DFU medium (e.g. "mmc")
 259 * @param devstring - instance number of destination DFU medium (e.g. "1")
 260 *
 261 * @return 0 on success, otherwise error code
 262 */
 263#ifdef CONFIG_DFU_TFTP
 264int dfu_tftp_write(char *dfu_entity_name, unsigned int addr, unsigned int len,
 265                   char *interface, char *devstring);
 266#else
 267static inline int dfu_tftp_write(char *dfu_entity_name, unsigned int addr,
 268                                 unsigned int len, char *interface,
 269                                 char *devstring)
 270{
 271        puts("TFTP write support for DFU not available!\n");
 272        return -ENOSYS;
 273}
 274#endif
 275
 276int dfu_add(struct usb_configuration *c);
 277#endif /* __DFU_ENTITY_H_ */
 278