OpenCores
URL https://opencores.org/ocsvn/openrisc_2011-10-31/openrisc_2011-10-31/trunk

Subversion Repositories openrisc_2011-10-31

[/] [openrisc/] [trunk/] [rtos/] [ecos-2.0/] [packages/] [devs/] [flash/] [synth/] [v2_0/] [src/] [synth.c] - Blame information for rev 174

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 27 unneback
//==========================================================================
2
//
3
//      synth.c
4
//
5
//      Flash programming
6
//
7
//==========================================================================
8
//####ECOSGPLCOPYRIGHTBEGIN####
9
// -------------------------------------------
10
// This file is part of eCos, the Embedded Configurable Operating System.
11
// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
12
//
13
// eCos is free software; you can redistribute it and/or modify it under
14
// the terms of the GNU General Public License as published by the Free
15
// Software Foundation; either version 2 or (at your option) any later version.
16
//
17
// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
18
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
19
// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
20
// for more details.
21
//
22
// You should have received a copy of the GNU General Public License along
23
// with eCos; if not, write to the Free Software Foundation, Inc.,
24
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
25
//
26
// As a special exception, if other files instantiate templates or use macros
27
// or inline functions from this file, or you compile this file and link it
28
// with other works to produce a work based on this file, this file does not
29
// by itself cause the resulting work to be covered by the GNU General Public
30
// License. However the source code for this file must still be made available
31
// in accordance with section (3) of the GNU General Public License.
32
//
33
// This exception does not invalidate any other reasons why a work based on
34
// this file might be covered by the GNU General Public License.
35
//
36
// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
37
// at http://sources.redhat.com/ecos/ecos-license/
38
// -------------------------------------------
39
//####ECOSGPLCOPYRIGHTEND####
40
//==========================================================================
41
//#####DESCRIPTIONBEGIN####
42
//
43
// Author(s):    andrew.lunn@ascom.ch
44
// Contributors: jlarmour
45
// Date:         2001-10-30
46
// Purpose:      
47
// Description:  
48
//              
49
//####DESCRIPTIONEND####
50
//
51
//==========================================================================
52
 
53
#include <pkgconf/devs_flash_synth.h>
54
 
55
#include <cyg/hal/hal_io.h>
56
#include <cyg/infra/cyg_ass.h>
57
#include <errno.h>
58
#include <string.h>
59
 
60
#define  _FLASH_PRIVATE_
61
#include <cyg/io/flash.h>
62
 
63
#include "synth.h"
64
 
65
/* Holds the fd for the flash file */
66
int cyg_dev_flash_synth_flashfd;
67
 
68
/* Holds the base address of the mmap'd region */
69
flash_t *cyg_dev_flash_synth_base;
70
 
71
/* Helper function. The Linux system call cannot pass 6 parameters. Instead
72
   a structure is filled in and passed as one parameter */
73
static int
74
cyg_hal_sys_do_mmap(void *addr, unsigned long length, unsigned long prot,
75
                    unsigned long flags, unsigned long fd, unsigned long off)
76
{
77
 
78
    struct cyg_hal_sys_mmap_args args;
79
 
80
    args.addr = (unsigned long) addr;
81
    args.len = length;
82
    args.prot = prot = prot;
83
    args.flags = flags;
84
    args.fd = fd;
85
    args.offset = off;
86
 
87
    return (cyg_hal_sys_mmap(&args));
88
}
89
 
90
int
91
flash_hwr_init(void)
92
{
93
    flash_info.block_size = CYGNUM_FLASH_SYNTH_BLOCKSIZE;
94
    flash_info.buffer_size = 0;
95
    flash_info.blocks = CYGNUM_FLASH_SYNTH_NUMBLOCKS;
96
 
97
    cyg_dev_flash_synth_flashfd = cyg_hal_sys_open(CYGDAT_FLASH_SYNTH_FILENAME,
98
                CYG_HAL_SYS_O_RDWR,
99
                CYG_HAL_SYS_S_IRWXU|CYG_HAL_SYS_S_IRWXG|CYG_HAL_SYS_S_IRWXO);
100
    if (cyg_dev_flash_synth_flashfd == -ENOENT) {
101
        long w, bytesleft;
102
        char buf[128];
103
 
104
        cyg_dev_flash_synth_flashfd = cyg_hal_sys_open(
105
                CYGDAT_FLASH_SYNTH_FILENAME,
106
                CYG_HAL_SYS_O_RDWR|CYG_HAL_SYS_O_CREAT,
107
                CYG_HAL_SYS_S_IRWXU|CYG_HAL_SYS_S_IRWXG|CYG_HAL_SYS_S_IRWXO);
108
        CYG_ASSERT( cyg_dev_flash_synth_flashfd >= 0,
109
                    "Opening of the file for the synth flash failed!");
110
        // fill with 0xff
111
        memset( buf, 0xff, sizeof(buf) );
112
        bytesleft = CYGNUM_FLASH_SYNTH_BLOCKSIZE * CYGNUM_FLASH_SYNTH_NUMBLOCKS;
113
        while (bytesleft > 0)
114
        {
115
            int bytesneeded;
116
            bytesneeded = bytesleft < sizeof(buf) ?  bytesleft : sizeof(buf);
117
 
118
            w = cyg_hal_sys_write( cyg_dev_flash_synth_flashfd, buf,
119
                                   bytesneeded );
120
            CYG_ASSERT(w == bytesneeded, "initialization of flash file failed");
121
            bytesleft -= bytesneeded;
122
        } // while
123
    }
124
    CYG_ASSERT( cyg_dev_flash_synth_flashfd >= 0,
125
                "Opening of the file for the synth flash failed!");
126
    if ( cyg_dev_flash_synth_flashfd <= 0 ) {
127
        return FLASH_ERR_HWR;
128
    }
129
    cyg_dev_flash_synth_base = (flash_t *)cyg_hal_sys_do_mmap(
130
#ifdef CYGMEM_FLASH_SYNTH_BASE
131
                CYGMEM_FLASH_SYNTH_BASE,
132
#else
133
                NULL,
134
#endif
135
                (CYGNUM_FLASH_SYNTH_BLOCKSIZE * CYGNUM_FLASH_SYNTH_NUMBLOCKS),
136
                CYG_HAL_SYS_PROT_READ,
137
#ifdef CYGSEM_FLASH_SYNTH_FILE_WRITEBACK
138
                CYG_HAL_SYS_MAP_SHARED
139
#else
140
                CYG_HAL_SYS_MAP_PRIVATE
141
#endif
142
#ifdef CYGMEM_FLASH_SYNTH_BASE
143
                |CYG_HAL_SYS_MAP_FIXED
144
#endif
145
                , cyg_dev_flash_synth_flashfd, 0 );
146
    CYG_ASSERT( cyg_dev_flash_synth_base > 0, "mmap of flash file failed!" );
147
 
148
    if (cyg_dev_flash_synth_base <= 0) {
149
        return FLASH_ERR_HWR;
150
    }
151
    flash_info.start = cyg_dev_flash_synth_base;
152
    flash_info.end = (void *)(((char *)cyg_dev_flash_synth_base) +
153
        (CYGNUM_FLASH_SYNTH_BLOCKSIZE * CYGNUM_FLASH_SYNTH_NUMBLOCKS));
154
 
155
    return FLASH_ERR_OK;
156
}
157
 
158
// Map a hardware status to a package error
159
int
160
flash_hwr_map_error(int err)
161
{
162
    return err;
163
}
164
 
165
// See if a range of FLASH addresses overlaps currently running code
166
bool
167
flash_code_overlaps(void *start, void *end)
168
{
169
    extern char _stext[], _etext[];
170
 
171
    return ((((unsigned long)&_stext >= (unsigned long)start) &&
172
             ((unsigned long)&_stext < (unsigned long)end)) ||
173
            (((unsigned long)&_etext >= (unsigned long)start) &&
174
             ((unsigned long)&_etext < (unsigned long)end)));
175
}
176
 
177
// EOF synth.c

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.