1f22b11c1SLukasz Majewski /* 2f22b11c1SLukasz Majewski * dfu.h - DFU flashable area description 3f22b11c1SLukasz Majewski * 4f22b11c1SLukasz Majewski * Copyright (C) 2012 Samsung Electronics 5f22b11c1SLukasz Majewski * authors: Andrzej Pietrasiewicz <andrzej.p@samsung.com> 6f22b11c1SLukasz Majewski * Lukasz Majewski <l.majewski@samsung.com> 7f22b11c1SLukasz Majewski * 81a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+ 9f22b11c1SLukasz Majewski */ 10f22b11c1SLukasz Majewski 11f22b11c1SLukasz Majewski #ifndef __DFU_ENTITY_H_ 12f22b11c1SLukasz Majewski #define __DFU_ENTITY_H_ 13f22b11c1SLukasz Majewski 14f22b11c1SLukasz Majewski #include <common.h> 15f22b11c1SLukasz Majewski #include <linux/list.h> 16f22b11c1SLukasz Majewski #include <mmc.h> 17*6f12ebf6SStephen Warren #include <spi_flash.h> 18a6921adcSLukasz Majewski #include <linux/usb/composite.h> 19f22b11c1SLukasz Majewski 20f22b11c1SLukasz Majewski enum dfu_device_type { 21f22b11c1SLukasz Majewski DFU_DEV_MMC = 1, 22f22b11c1SLukasz Majewski DFU_DEV_ONENAND, 23f22b11c1SLukasz Majewski DFU_DEV_NAND, 24a9479f04SAfzal Mohammed DFU_DEV_RAM, 25*6f12ebf6SStephen Warren DFU_DEV_SF, 26f22b11c1SLukasz Majewski }; 27f22b11c1SLukasz Majewski 28f22b11c1SLukasz Majewski enum dfu_layout { 29f22b11c1SLukasz Majewski DFU_RAW_ADDR = 1, 30f22b11c1SLukasz Majewski DFU_FS_FAT, 31f22b11c1SLukasz Majewski DFU_FS_EXT2, 32f22b11c1SLukasz Majewski DFU_FS_EXT3, 33f22b11c1SLukasz Majewski DFU_FS_EXT4, 34a9479f04SAfzal Mohammed DFU_RAM_ADDR, 35f22b11c1SLukasz Majewski }; 36f22b11c1SLukasz Majewski 375a127c84SAfzal Mohammed enum dfu_op { 385a127c84SAfzal Mohammed DFU_OP_READ = 1, 395a127c84SAfzal Mohammed DFU_OP_WRITE, 400e285b50SStephen Warren DFU_OP_SIZE, 415a127c84SAfzal Mohammed }; 425a127c84SAfzal Mohammed 43f22b11c1SLukasz Majewski struct mmc_internal_data { 44dd64827eSStephen Warren int dev_num; 45dd64827eSStephen Warren 46f22b11c1SLukasz Majewski /* RAW programming */ 47f22b11c1SLukasz Majewski unsigned int lba_start; 48f22b11c1SLukasz Majewski unsigned int lba_size; 49f22b11c1SLukasz Majewski unsigned int lba_blk_size; 50f22b11c1SLukasz Majewski 51c8151b4aSLukasz Majewski /* eMMC HW partition access */ 52c8151b4aSLukasz Majewski int hw_partition; 53c8151b4aSLukasz Majewski 54f22b11c1SLukasz Majewski /* FAT/EXT */ 55f22b11c1SLukasz Majewski unsigned int dev; 56f22b11c1SLukasz Majewski unsigned int part; 57f22b11c1SLukasz Majewski }; 58f22b11c1SLukasz Majewski 59c6631764SPantelis Antoniou struct nand_internal_data { 60c6631764SPantelis Antoniou /* RAW programming */ 61c6631764SPantelis Antoniou u64 start; 62c6631764SPantelis Antoniou u64 size; 63c6631764SPantelis Antoniou 64c6631764SPantelis Antoniou unsigned int dev; 65c6631764SPantelis Antoniou unsigned int part; 66815c30b2SHeiko Schocher /* for nand/ubi use */ 67815c30b2SHeiko Schocher unsigned int ubi; 68c6631764SPantelis Antoniou }; 69c6631764SPantelis Antoniou 70a9479f04SAfzal Mohammed struct ram_internal_data { 71a9479f04SAfzal Mohammed void *start; 72a9479f04SAfzal Mohammed unsigned int size; 73a9479f04SAfzal Mohammed }; 74a9479f04SAfzal Mohammed 75*6f12ebf6SStephen Warren struct sf_internal_data { 76*6f12ebf6SStephen Warren struct spi_flash *dev; 77*6f12ebf6SStephen Warren 78*6f12ebf6SStephen Warren /* RAW programming */ 79*6f12ebf6SStephen Warren u64 start; 80*6f12ebf6SStephen Warren u64 size; 81*6f12ebf6SStephen Warren }; 82*6f12ebf6SStephen Warren 83f22b11c1SLukasz Majewski #define DFU_NAME_SIZE 32 84f22b11c1SLukasz Majewski #define DFU_CMD_BUF_SIZE 128 85e7e75c70SHeiko Schocher #ifndef CONFIG_SYS_DFU_DATA_BUF_SIZE 86e7e75c70SHeiko Schocher #define CONFIG_SYS_DFU_DATA_BUF_SIZE (1024*1024*8) /* 8 MiB */ 87e7e75c70SHeiko Schocher #endif 88ea2453d5SPantelis Antoniou #ifndef CONFIG_SYS_DFU_MAX_FILE_SIZE 897a813d5bSLukasz Majewski #define CONFIG_SYS_DFU_MAX_FILE_SIZE CONFIG_SYS_DFU_DATA_BUF_SIZE 90ea2453d5SPantelis Antoniou #endif 9133fac4a6SLukasz Majewski #ifndef DFU_DEFAULT_POLL_TIMEOUT 9233fac4a6SLukasz Majewski #define DFU_DEFAULT_POLL_TIMEOUT 0 9333fac4a6SLukasz Majewski #endif 94001a8319SHeiko Schocher #ifndef DFU_MANIFEST_POLL_TIMEOUT 95001a8319SHeiko Schocher #define DFU_MANIFEST_POLL_TIMEOUT DFU_DEFAULT_POLL_TIMEOUT 96001a8319SHeiko Schocher #endif 97f22b11c1SLukasz Majewski 98f22b11c1SLukasz Majewski struct dfu_entity { 99f22b11c1SLukasz Majewski char name[DFU_NAME_SIZE]; 100f22b11c1SLukasz Majewski int alt; 101f22b11c1SLukasz Majewski void *dev_private; 102f22b11c1SLukasz Majewski enum dfu_device_type dev_type; 103f22b11c1SLukasz Majewski enum dfu_layout layout; 1047ac1b410SStephen Warren unsigned long max_buf_size; 105f22b11c1SLukasz Majewski 106f22b11c1SLukasz Majewski union { 107f22b11c1SLukasz Majewski struct mmc_internal_data mmc; 108c6631764SPantelis Antoniou struct nand_internal_data nand; 109a9479f04SAfzal Mohammed struct ram_internal_data ram; 110*6f12ebf6SStephen Warren struct sf_internal_data sf; 111f22b11c1SLukasz Majewski } data; 112f22b11c1SLukasz Majewski 1130e285b50SStephen Warren long (*get_medium_size)(struct dfu_entity *dfu); 1140e285b50SStephen Warren 115ea2453d5SPantelis Antoniou int (*read_medium)(struct dfu_entity *dfu, 116ea2453d5SPantelis Antoniou u64 offset, void *buf, long *len); 117ea2453d5SPantelis Antoniou 118ea2453d5SPantelis Antoniou int (*write_medium)(struct dfu_entity *dfu, 119ea2453d5SPantelis Antoniou u64 offset, void *buf, long *len); 120ea2453d5SPantelis Antoniou 121ea2453d5SPantelis Antoniou int (*flush_medium)(struct dfu_entity *dfu); 122fc25fa27SHeiko Schocher unsigned int (*poll_timeout)(struct dfu_entity *dfu); 123f22b11c1SLukasz Majewski 124cb7bd2e0SStephen Warren void (*free_entity)(struct dfu_entity *dfu); 125cb7bd2e0SStephen Warren 126f22b11c1SLukasz Majewski struct list_head list; 127ea2453d5SPantelis Antoniou 128ea2453d5SPantelis Antoniou /* on the fly state */ 129ea2453d5SPantelis Antoniou u32 crc; 130ea2453d5SPantelis Antoniou u64 offset; 131ea2453d5SPantelis Antoniou int i_blk_seq_num; 132ea2453d5SPantelis Antoniou u8 *i_buf; 133ea2453d5SPantelis Antoniou u8 *i_buf_start; 134ea2453d5SPantelis Antoniou u8 *i_buf_end; 135ea2453d5SPantelis Antoniou long r_left; 136ea2453d5SPantelis Antoniou long b_left; 137ea2453d5SPantelis Antoniou 138c6631764SPantelis Antoniou u32 bad_skip; /* for nand use */ 139c6631764SPantelis Antoniou 140ea2453d5SPantelis Antoniou unsigned int inited:1; 141f22b11c1SLukasz Majewski }; 142f22b11c1SLukasz Majewski 143dd64827eSStephen Warren int dfu_config_entities(char *s, char *interface, char *devstr); 144f22b11c1SLukasz Majewski void dfu_free_entities(void); 145f22b11c1SLukasz Majewski void dfu_show_entities(void); 146f22b11c1SLukasz Majewski int dfu_get_alt_number(void); 147f22b11c1SLukasz Majewski const char *dfu_get_dev_type(enum dfu_device_type t); 148f22b11c1SLukasz Majewski const char *dfu_get_layout(enum dfu_layout l); 149f22b11c1SLukasz Majewski struct dfu_entity *dfu_get_entity(int alt); 150f22b11c1SLukasz Majewski char *dfu_extract_token(char** e, int *n); 1516bed7ce5SLukasz Majewski void dfu_trigger_reset(void); 152fed936edSLukasz Majewski int dfu_get_alt(char *name); 1536bed7ce5SLukasz Majewski bool dfu_reset(void); 154dd64827eSStephen Warren int dfu_init_env_entities(char *interface, char *devstr); 1557ac1b410SStephen Warren unsigned char *dfu_get_buf(struct dfu_entity *dfu); 156d4278263SLukasz Majewski unsigned char *dfu_free_buf(void); 1574fb12789SLukasz Majewski unsigned long dfu_get_buf_size(void); 158f22b11c1SLukasz Majewski 159f22b11c1SLukasz Majewski int dfu_read(struct dfu_entity *de, void *buf, int size, int blk_seq_num); 160f22b11c1SLukasz Majewski int dfu_write(struct dfu_entity *de, void *buf, int size, int blk_seq_num); 161a2199afeSHeiko Schocher int dfu_flush(struct dfu_entity *de, void *buf, int size, int blk_seq_num); 162f22b11c1SLukasz Majewski /* Device specific */ 163f22b11c1SLukasz Majewski #ifdef CONFIG_DFU_MMC 164dd64827eSStephen Warren extern int dfu_fill_entity_mmc(struct dfu_entity *dfu, char *devstr, char *s); 165f22b11c1SLukasz Majewski #else 166dd64827eSStephen Warren static inline int dfu_fill_entity_mmc(struct dfu_entity *dfu, char *devstr, 167dd64827eSStephen Warren char *s) 168f22b11c1SLukasz Majewski { 169f22b11c1SLukasz Majewski puts("MMC support not available!\n"); 170f22b11c1SLukasz Majewski return -1; 171f22b11c1SLukasz Majewski } 172f22b11c1SLukasz Majewski #endif 173c6631764SPantelis Antoniou 174c6631764SPantelis Antoniou #ifdef CONFIG_DFU_NAND 175dd64827eSStephen Warren extern int dfu_fill_entity_nand(struct dfu_entity *dfu, char *devstr, char *s); 176c6631764SPantelis Antoniou #else 177dd64827eSStephen Warren static inline int dfu_fill_entity_nand(struct dfu_entity *dfu, char *devstr, 178dd64827eSStephen Warren char *s) 179c6631764SPantelis Antoniou { 180c6631764SPantelis Antoniou puts("NAND support not available!\n"); 181c6631764SPantelis Antoniou return -1; 182c6631764SPantelis Antoniou } 183c6631764SPantelis Antoniou #endif 184c6631764SPantelis Antoniou 185a9479f04SAfzal Mohammed #ifdef CONFIG_DFU_RAM 186dd64827eSStephen Warren extern int dfu_fill_entity_ram(struct dfu_entity *dfu, char *devstr, char *s); 187a9479f04SAfzal Mohammed #else 188dd64827eSStephen Warren static inline int dfu_fill_entity_ram(struct dfu_entity *dfu, char *devstr, 189dd64827eSStephen Warren char *s) 190a9479f04SAfzal Mohammed { 191a9479f04SAfzal Mohammed puts("RAM support not available!\n"); 192a9479f04SAfzal Mohammed return -1; 193a9479f04SAfzal Mohammed } 194a9479f04SAfzal Mohammed #endif 195a9479f04SAfzal Mohammed 196*6f12ebf6SStephen Warren #ifdef CONFIG_DFU_SF 197*6f12ebf6SStephen Warren extern int dfu_fill_entity_sf(struct dfu_entity *dfu, char *devstr, char *s); 198*6f12ebf6SStephen Warren #else 199*6f12ebf6SStephen Warren static inline int dfu_fill_entity_sf(struct dfu_entity *dfu, char *devstr, 200*6f12ebf6SStephen Warren char *s) 201*6f12ebf6SStephen Warren { 202*6f12ebf6SStephen Warren puts("SF support not available!\n"); 203*6f12ebf6SStephen Warren return -1; 204*6f12ebf6SStephen Warren } 205*6f12ebf6SStephen Warren #endif 206*6f12ebf6SStephen Warren 207a6921adcSLukasz Majewski int dfu_add(struct usb_configuration *c); 208f22b11c1SLukasz Majewski #endif /* __DFU_ENTITY_H_ */ 209