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; 50c6631764SPantelis Antoniou }; 51c6631764SPantelis Antoniou 52f22b11c1SLukasz Majewski static inline unsigned int get_mmc_blk_size(int dev) 53f22b11c1SLukasz Majewski { 54f22b11c1SLukasz Majewski return find_mmc_device(dev)->read_bl_len; 55f22b11c1SLukasz Majewski } 56f22b11c1SLukasz Majewski 57f22b11c1SLukasz Majewski #define DFU_NAME_SIZE 32 58f22b11c1SLukasz Majewski #define DFU_CMD_BUF_SIZE 128 59e7e75c70SHeiko Schocher #ifndef CONFIG_SYS_DFU_DATA_BUF_SIZE 60e7e75c70SHeiko Schocher #define CONFIG_SYS_DFU_DATA_BUF_SIZE (1024*1024*8) /* 8 MiB */ 61e7e75c70SHeiko Schocher #endif 62ea2453d5SPantelis Antoniou #ifndef CONFIG_SYS_DFU_MAX_FILE_SIZE 63ea2453d5SPantelis Antoniou #define CONFIG_SYS_DFU_MAX_FILE_SIZE (4 << 20) /* 4 MiB */ 64ea2453d5SPantelis Antoniou #endif 65f22b11c1SLukasz Majewski 66f22b11c1SLukasz Majewski struct dfu_entity { 67f22b11c1SLukasz Majewski char name[DFU_NAME_SIZE]; 68f22b11c1SLukasz Majewski int alt; 69f22b11c1SLukasz Majewski void *dev_private; 70f22b11c1SLukasz Majewski int dev_num; 71f22b11c1SLukasz Majewski enum dfu_device_type dev_type; 72f22b11c1SLukasz Majewski enum dfu_layout layout; 73f22b11c1SLukasz Majewski 74f22b11c1SLukasz Majewski union { 75f22b11c1SLukasz Majewski struct mmc_internal_data mmc; 76c6631764SPantelis Antoniou struct nand_internal_data nand; 77f22b11c1SLukasz Majewski } data; 78f22b11c1SLukasz Majewski 79ea2453d5SPantelis Antoniou int (*read_medium)(struct dfu_entity *dfu, 80ea2453d5SPantelis Antoniou u64 offset, void *buf, long *len); 81ea2453d5SPantelis Antoniou 82ea2453d5SPantelis Antoniou int (*write_medium)(struct dfu_entity *dfu, 83ea2453d5SPantelis Antoniou u64 offset, void *buf, long *len); 84ea2453d5SPantelis Antoniou 85ea2453d5SPantelis Antoniou int (*flush_medium)(struct dfu_entity *dfu); 86f22b11c1SLukasz Majewski 87f22b11c1SLukasz Majewski struct list_head list; 88ea2453d5SPantelis Antoniou 89ea2453d5SPantelis Antoniou /* on the fly state */ 90ea2453d5SPantelis Antoniou u32 crc; 91ea2453d5SPantelis Antoniou u64 offset; 92ea2453d5SPantelis Antoniou int i_blk_seq_num; 93ea2453d5SPantelis Antoniou u8 *i_buf; 94ea2453d5SPantelis Antoniou u8 *i_buf_start; 95ea2453d5SPantelis Antoniou u8 *i_buf_end; 96ea2453d5SPantelis Antoniou long r_left; 97ea2453d5SPantelis Antoniou long b_left; 98ea2453d5SPantelis Antoniou 99c6631764SPantelis Antoniou u32 bad_skip; /* for nand use */ 100c6631764SPantelis Antoniou 101ea2453d5SPantelis Antoniou unsigned int inited:1; 102f22b11c1SLukasz Majewski }; 103f22b11c1SLukasz Majewski 104f22b11c1SLukasz Majewski int dfu_config_entities(char *s, char *interface, int num); 105f22b11c1SLukasz Majewski void dfu_free_entities(void); 106f22b11c1SLukasz Majewski void dfu_show_entities(void); 107f22b11c1SLukasz Majewski int dfu_get_alt_number(void); 108f22b11c1SLukasz Majewski const char *dfu_get_dev_type(enum dfu_device_type t); 109f22b11c1SLukasz Majewski const char *dfu_get_layout(enum dfu_layout l); 110f22b11c1SLukasz Majewski struct dfu_entity *dfu_get_entity(int alt); 111f22b11c1SLukasz Majewski char *dfu_extract_token(char** e, int *n); 112*6bed7ce5SLukasz Majewski void dfu_trigger_reset(void); 113*6bed7ce5SLukasz Majewski bool dfu_reset(void); 114f22b11c1SLukasz Majewski 115f22b11c1SLukasz Majewski int dfu_read(struct dfu_entity *de, void *buf, int size, int blk_seq_num); 116f22b11c1SLukasz Majewski int dfu_write(struct dfu_entity *de, void *buf, int size, int blk_seq_num); 117f22b11c1SLukasz Majewski /* Device specific */ 118f22b11c1SLukasz Majewski #ifdef CONFIG_DFU_MMC 119f22b11c1SLukasz Majewski extern int dfu_fill_entity_mmc(struct dfu_entity *dfu, char *s); 120f22b11c1SLukasz Majewski #else 121f22b11c1SLukasz Majewski static inline int dfu_fill_entity_mmc(struct dfu_entity *dfu, char *s) 122f22b11c1SLukasz Majewski { 123f22b11c1SLukasz Majewski puts("MMC support not available!\n"); 124f22b11c1SLukasz Majewski return -1; 125f22b11c1SLukasz Majewski } 126f22b11c1SLukasz Majewski #endif 127c6631764SPantelis Antoniou 128c6631764SPantelis Antoniou #ifdef CONFIG_DFU_NAND 129c6631764SPantelis Antoniou extern int dfu_fill_entity_nand(struct dfu_entity *dfu, char *s); 130c6631764SPantelis Antoniou #else 131c6631764SPantelis Antoniou static inline int dfu_fill_entity_nand(struct dfu_entity *dfu, char *s) 132c6631764SPantelis Antoniou { 133c6631764SPantelis Antoniou puts("NAND support not available!\n"); 134c6631764SPantelis Antoniou return -1; 135c6631764SPantelis Antoniou } 136c6631764SPantelis Antoniou #endif 137c6631764SPantelis Antoniou 138f22b11c1SLukasz Majewski #endif /* __DFU_ENTITY_H_ */ 139