STM32 V5 source code
guowenxue
2018-02-04 785deec23b4cb1e7c4c4d81eb808f195adb1d98a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
/*
 * Copyright (c) 2005, Swedish Institute of Computer Science
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. Neither the name of the Institute nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 * This file is part of the Contiki operating system.
 *
 */
/**
 * \addtogroup elfloader
 * @{
 */
 
/**
 * \defgroup elfloaderarch Architecture specific functionality for the ELF loader.
 *
 * The architecture specific functionality for the Contiki ELF loader
 * has to be implemented for each processor type Contiki runs on.
 *
 * Since the ELF format is slightly different for different processor
 * types, the Contiki ELF loader is divided into two parts: the
 * generic ELF loader module (\ref elfloader) and the architecture
 * specific part (this module). The architecture specific part deals
 * with memory allocation, code and data relocation, and writing the
 * relocated ELF code into program memory.
 *
 * To port the Contiki ELF loader to a new processor type, this module
 * has to be implemented for the new processor type.
 *
 * @{
 */
 
/**
 * \file
 *         Header file for the architecture specific parts of the Contiki ELF loader.
 *
 * \author
 *         Adam Dunkels <adam@sics.se>
 *
 */
 
#ifndef __ELFLOADER_ARCH_H__
#define __ELFLOADER_ARCH_H__
 
#include "loader/elfloader.h"
 
/**
 * \brief      Allocate RAM for a new module.
 * \param size The size of the requested memory.
 * \return     A pointer to the allocated RAM
 *
 *             This function is called from the Contiki ELF loader to
 *             allocate RAM for the module to be loaded into.
 *
 * \bug        The Contiki ELF loader currently does not contain a
 *             mechanism for deallocating the memory allocated with
 *             this function.
 */
void *elfloader_arch_allocate_ram(int size);
 
/**
 * \brief      Allocate program memory for a new module.
 * \param size The size of the requested memory.
 * \return     A pointer to the allocated program memory
 *
 *             This function is called from the Contiki ELF loader to
 *             allocate program memory (typically ROM) for the module
 *             to be loaded into.
 *
 * \bug        The Contiki ELF loader currently does not contain a
 *             mechanism for deallocating the memory allocated with
 *             this function.
 */
void *elfloader_arch_allocate_rom(int size);
 
/**
 * \brief      Perform a relocation.
 * \param fd   The file descriptor for the ELF file.
 * \param sectionoffset The file offset at which the relocation can be found.
 * \param sectionaddr The section start address (absolute runtime).
 * \param rela A pointer to an ELF32 rela structure (struct elf32_rela).
 * \param addr The relocated address.
 *
 *             This function is called from the Contiki ELF loader to
 *             perform a relocation on a piece of code or data. The
 *             relocated address is calculated by the Contiki ELF
 *             loader, based on information in the ELF file, and it is
 *             the responsibility of this function to patch the
 *             executable code. The Contiki ELF loader passes a
 *             pointer to an ELF32 rela structure (struct elf32_rela)
 *             that contains information about how to patch the
 *             code. This information is different from processor to
 *             processor.
 */
void elfloader_arch_relocate(int fd, unsigned int sectionoffset,
                 char *sectionaddr,
                 struct elf32_rela *rela, char *addr);
 
/**
 * \brief      Write to read-only memory (for example the text segment).
 * \param fd   The file descriptor for the ELF file.
 * \param textoff    Offset of text segment relative start of file.
 * \param size The size of the text segment.
 * \param mem  A pointer to the where the text segment should be flashed
 *
 *             This function is called from the Contiki ELF loader to
 *             write the program code (text segment) of a loaded
 *             module into memory. The function is called when all
 *             relocations have been performed.
 */
void elfloader_arch_write_rom(int fd, unsigned short textoff, unsigned int size, char *mem);
 
#endif /* __ELFLOADER_ARCH_H__ */
 
/** @} */
/** @} */