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> 17f22b11c1SLukasz Majewski 18f22b11c1SLukasz Majewski enum dfu_device_type { 19f22b11c1SLukasz Majewski DFU_DEV_MMC = 1, 20f22b11c1SLukasz Majewski DFU_DEV_ONENAND, 21f22b11c1SLukasz Majewski DFU_DEV_NAND, 22f22b11c1SLukasz Majewski }; 23f22b11c1SLukasz Majewski 24f22b11c1SLukasz Majewski enum dfu_layout { 25f22b11c1SLukasz Majewski DFU_RAW_ADDR = 1, 26f22b11c1SLukasz Majewski DFU_FS_FAT, 27f22b11c1SLukasz Majewski DFU_FS_EXT2, 28f22b11c1SLukasz Majewski DFU_FS_EXT3, 29f22b11c1SLukasz Majewski DFU_FS_EXT4, 30f22b11c1SLukasz Majewski }; 31f22b11c1SLukasz Majewski 32f22b11c1SLukasz Majewski struct mmc_internal_data { 33f22b11c1SLukasz Majewski /* RAW programming */ 34f22b11c1SLukasz Majewski unsigned int lba_start; 35f22b11c1SLukasz Majewski unsigned int lba_size; 36f22b11c1SLukasz Majewski unsigned int lba_blk_size; 37f22b11c1SLukasz Majewski 38f22b11c1SLukasz Majewski /* FAT/EXT */ 39f22b11c1SLukasz Majewski unsigned int dev; 40f22b11c1SLukasz Majewski unsigned int part; 41f22b11c1SLukasz Majewski }; 42f22b11c1SLukasz Majewski 43c6631764SPantelis Antoniou struct nand_internal_data { 44c6631764SPantelis Antoniou /* RAW programming */ 45c6631764SPantelis Antoniou u64 start; 46c6631764SPantelis Antoniou u64 size; 47c6631764SPantelis Antoniou 48c6631764SPantelis Antoniou unsigned int dev; 49c6631764SPantelis Antoniou unsigned int part; 50815c30b2SHeiko Schocher /* for nand/ubi use */ 51815c30b2SHeiko Schocher unsigned int ubi; 52c6631764SPantelis Antoniou }; 53c6631764SPantelis Antoniou 54f22b11c1SLukasz Majewski static inline unsigned int get_mmc_blk_size(int dev) 55f22b11c1SLukasz Majewski { 56f22b11c1SLukasz Majewski return find_mmc_device(dev)->read_bl_len; 57f22b11c1SLukasz Majewski } 58f22b11c1SLukasz Majewski 59f22b11c1SLukasz Majewski #define DFU_NAME_SIZE 32 60f22b11c1SLukasz Majewski #define DFU_CMD_BUF_SIZE 128 61e7e75c70SHeiko Schocher #ifndef CONFIG_SYS_DFU_DATA_BUF_SIZE 62e7e75c70SHeiko Schocher #define CONFIG_SYS_DFU_DATA_BUF_SIZE (1024*1024*8) /* 8 MiB */ 63e7e75c70SHeiko Schocher #endif 64ea2453d5SPantelis Antoniou #ifndef CONFIG_SYS_DFU_MAX_FILE_SIZE 65*7a813d5bSLukasz Majewski #define CONFIG_SYS_DFU_MAX_FILE_SIZE CONFIG_SYS_DFU_DATA_BUF_SIZE 66ea2453d5SPantelis Antoniou #endif 67f22b11c1SLukasz Majewski 68f22b11c1SLukasz Majewski struct dfu_entity { 69f22b11c1SLukasz Majewski char name[DFU_NAME_SIZE]; 70f22b11c1SLukasz Majewski int alt; 71f22b11c1SLukasz Majewski void *dev_private; 72f22b11c1SLukasz Majewski int dev_num; 73f22b11c1SLukasz Majewski enum dfu_device_type dev_type; 74f22b11c1SLukasz Majewski enum dfu_layout layout; 75f22b11c1SLukasz Majewski 76f22b11c1SLukasz Majewski union { 77f22b11c1SLukasz Majewski struct mmc_internal_data mmc; 78c6631764SPantelis Antoniou struct nand_internal_data nand; 79f22b11c1SLukasz Majewski } data; 80f22b11c1SLukasz Majewski 81ea2453d5SPantelis Antoniou int (*read_medium)(struct dfu_entity *dfu, 82ea2453d5SPantelis Antoniou u64 offset, void *buf, long *len); 83ea2453d5SPantelis Antoniou 84ea2453d5SPantelis Antoniou int (*write_medium)(struct dfu_entity *dfu, 85ea2453d5SPantelis Antoniou u64 offset, void *buf, long *len); 86ea2453d5SPantelis Antoniou 87ea2453d5SPantelis Antoniou int (*flush_medium)(struct dfu_entity *dfu); 88f22b11c1SLukasz Majewski 89f22b11c1SLukasz Majewski struct list_head list; 90ea2453d5SPantelis Antoniou 91ea2453d5SPantelis Antoniou /* on the fly state */ 92ea2453d5SPantelis Antoniou u32 crc; 93ea2453d5SPantelis Antoniou u64 offset; 94ea2453d5SPantelis Antoniou int i_blk_seq_num; 95ea2453d5SPantelis Antoniou u8 *i_buf; 96ea2453d5SPantelis Antoniou u8 *i_buf_start; 97ea2453d5SPantelis Antoniou u8 *i_buf_end; 98ea2453d5SPantelis Antoniou long r_left; 99ea2453d5SPantelis Antoniou long b_left; 100ea2453d5SPantelis Antoniou 101c6631764SPantelis Antoniou u32 bad_skip; /* for nand use */ 102c6631764SPantelis Antoniou 103ea2453d5SPantelis Antoniou unsigned int inited:1; 104f22b11c1SLukasz Majewski }; 105f22b11c1SLukasz Majewski 106f22b11c1SLukasz Majewski int dfu_config_entities(char *s, char *interface, int num); 107f22b11c1SLukasz Majewski void dfu_free_entities(void); 108f22b11c1SLukasz Majewski void dfu_show_entities(void); 109f22b11c1SLukasz Majewski int dfu_get_alt_number(void); 110f22b11c1SLukasz Majewski const char *dfu_get_dev_type(enum dfu_device_type t); 111f22b11c1SLukasz Majewski const char *dfu_get_layout(enum dfu_layout l); 112f22b11c1SLukasz Majewski struct dfu_entity *dfu_get_entity(int alt); 113f22b11c1SLukasz Majewski char *dfu_extract_token(char** e, int *n); 1146bed7ce5SLukasz Majewski void dfu_trigger_reset(void); 1156bed7ce5SLukasz Majewski bool dfu_reset(void); 116f22b11c1SLukasz Majewski 117f22b11c1SLukasz Majewski int dfu_read(struct dfu_entity *de, void *buf, int size, int blk_seq_num); 118f22b11c1SLukasz Majewski int dfu_write(struct dfu_entity *de, void *buf, int size, int blk_seq_num); 119f22b11c1SLukasz Majewski /* Device specific */ 120f22b11c1SLukasz Majewski #ifdef CONFIG_DFU_MMC 121f22b11c1SLukasz Majewski extern int dfu_fill_entity_mmc(struct dfu_entity *dfu, char *s); 122f22b11c1SLukasz Majewski #else 123f22b11c1SLukasz Majewski static inline int dfu_fill_entity_mmc(struct dfu_entity *dfu, char *s) 124f22b11c1SLukasz Majewski { 125f22b11c1SLukasz Majewski puts("MMC support not available!\n"); 126f22b11c1SLukasz Majewski return -1; 127f22b11c1SLukasz Majewski } 128f22b11c1SLukasz Majewski #endif 129c6631764SPantelis Antoniou 130c6631764SPantelis Antoniou #ifdef CONFIG_DFU_NAND 131c6631764SPantelis Antoniou extern int dfu_fill_entity_nand(struct dfu_entity *dfu, char *s); 132c6631764SPantelis Antoniou #else 133c6631764SPantelis Antoniou static inline int dfu_fill_entity_nand(struct dfu_entity *dfu, char *s) 134c6631764SPantelis Antoniou { 135c6631764SPantelis Antoniou puts("NAND support not available!\n"); 136c6631764SPantelis Antoniou return -1; 137c6631764SPantelis Antoniou } 138c6631764SPantelis Antoniou #endif 139c6631764SPantelis Antoniou 140f22b11c1SLukasz Majewski #endif /* __DFU_ENTITY_H_ */ 141