Mercurial > flash_v2
annotate packages/io/flash/current/src/flashiodev.c @ 1711:3bafac44ac03
* src/flashiodev.c: Fix typo in macro and configuration options
| author | asl |
|---|---|
| date | Fri, 06 Aug 2004 11:18:33 +0000 |
| parents | 3845779eca10 |
| children | 39063f315a19 |
| rev | line source |
|---|---|
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
1 //========================================================================== |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
2 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
3 // flashiodev.c |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
4 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
5 // Flash device interface to I/O subsystem |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
6 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
7 //========================================================================== |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
8 //####ECOSGPLCOPYRIGHTBEGIN#### |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
9 // ------------------------------------------- |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
10 // This file is part of eCos, the Embedded Configurable Operating System. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. |
| 1706 | 12 // Copyright (C) 2004 Andrew Lunn |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
13 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
14 // eCos is free software; you can redistribute it and/or modify it under |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
15 // the terms of the GNU General Public License as published by the Free |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
16 // Software Foundation; either version 2 or (at your option) any later version. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
17 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
18 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
19 // WARRANTY; without even the implied warranty of MERCHANTABILITY or |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
20 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
21 // for more details. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
22 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
23 // You should have received a copy of the GNU General Public License along |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
24 // with eCos; if not, write to the Free Software Foundation, Inc., |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
25 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
26 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
27 // As a special exception, if other files instantiate templates or use macros |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
28 // or inline functions from this file, or you compile this file and link it |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
29 // with other works to produce a work based on this file, this file does not |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
30 // by itself cause the resulting work to be covered by the GNU General Public |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
31 // License. However the source code for this file must still be made available |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
32 // in accordance with section (3) of the GNU General Public License. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
33 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
34 // This exception does not invalidate any other reasons why a work based on |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
35 // this file might be covered by the GNU General Public License. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
36 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
37 // Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. |
|
210
d2c90368aeef
Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents:
208
diff
changeset
|
38 // at http://sources.redhat.com/ecos/ecos-license/ |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
39 // ------------------------------------------- |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
40 //####ECOSGPLCOPYRIGHTEND#### |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
41 //========================================================================== |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
42 //#####DESCRIPTIONBEGIN#### |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
43 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
44 // Author(s): jlarmour |
| 1706 | 45 // Contributors: woehler, Andrew Lunn |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
46 // Date: 2002-01-16 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
47 // Purpose: |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
48 // Description: |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
49 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
50 //####DESCRIPTIONEND#### |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
51 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
52 //========================================================================== |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
53 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
54 #define _FLASH_PRIVATE_ |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
55 #include <pkgconf/io_flash.h> |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
56 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
57 #include <errno.h> |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
58 #include <cyg/infra/cyg_type.h> |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
59 #include <cyg/io/devtab.h> |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
60 #include <cyg/io/config_keys.h> |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
61 #include <cyg/io/flash.h> |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
62 #include <string.h> // memcpy |
|
791
a2dfa8bf3c57
Export RedBoot FIS functions - from Knud Woehler <knud.woehler@microplex.de>
gthomas
parents:
210
diff
changeset
|
63 #include <cyg/hal/hal_if.h> |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
64 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
65 #define MIN(x,y) ((x)<(y) ? (x) : (y)) |
| 1706 | 66 #define MAX(x,y) ((x)>(y) ? (x) : (y)) |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
67 |
|
791
a2dfa8bf3c57
Export RedBoot FIS functions - from Knud Woehler <knud.woehler@microplex.de>
gthomas
parents:
210
diff
changeset
|
68 struct flashiodev_priv_t{ |
| 1706 | 69 cyg_flashaddr_t start; |
| 70 cyg_flashaddr_t end; | |
| 71 cyg_bool use_fis; | |
| 72 cyg_bool use_absolute; | |
| 73 cyg_bool use_offset; | |
| 74 char * fis_name; | |
| 75 cyg_uint32 block_size; | |
|
791
a2dfa8bf3c57
Export RedBoot FIS functions - from Knud Woehler <knud.woehler@microplex.de>
gthomas
parents:
210
diff
changeset
|
76 }; |
|
a2dfa8bf3c57
Export RedBoot FIS functions - from Knud Woehler <knud.woehler@microplex.de>
gthomas
parents:
210
diff
changeset
|
77 |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
78 static int dummy_printf( const char *fmt, ... ) {return 0;} |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
79 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
80 static bool |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
81 flashiodev_init( struct cyg_devtab_entry *tab ) |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
82 { |
| 1706 | 83 struct flashiodev_priv_t *dev = (struct flashiodev_priv_t *)tab->priv; |
| 84 cyg_flash_info_t info; | |
| 85 cyg_uint32 i; | |
| 86 | |
| 87 int stat = cyg_flash_init( &dummy_printf ); | |
| 88 if ( stat == 0 ) { | |
| 89 if (dev->use_fis) { | |
| 90 CYG_ADDRESS flash_base; | |
| 91 unsigned long size; | |
| 92 | |
| 93 if(!CYGACC_CALL_IF_FLASH_FIS_OP(CYGNUM_CALL_IF_FLASH_FIS_GET_FLASH_BASE, | |
| 94 dev->fis_name, | |
| 95 &flash_base)) | |
| 96 return false; | |
| 97 if(!CYGACC_CALL_IF_FLASH_FIS_OP(CYGNUM_CALL_IF_FLASH_FIS_GET_SIZE, | |
| 98 dev->fis_name, | |
| 99 &size)) | |
| 100 return false; | |
| 101 | |
| 102 dev->start = flash_base; | |
| 103 dev->end = flash_base + size; | |
| 104 } | |
| 105 if (dev->use_offset) { | |
| 106 // dev->start the contain the offset to the beginning of the block | |
| 107 // dev->end is the length of the block | |
| 108 cyg_flashaddr_t start, end; | |
| 109 cyg_flash_get_limits(&start, &end); | |
| 110 dev->start = dev->start + start; | |
| 111 dev->end = dev->start + dev->end; | |
| 112 } | |
| 113 if (dev->use_absolute) { | |
| 114 // dev->start is the absolute address of the start | |
| 115 // dev->end is the length; | |
| 116 dev->end = dev->start + dev->end; | |
| 117 } | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
118 |
| 1706 | 119 stat = cyg_flash_get_info_addr(dev->start, &info); |
| 120 if (stat != CYG_FLASH_ERR_OK) { | |
| 121 return false; | |
| 122 } | |
| 123 dev->block_size = 0; | |
| 124 for (i=0; i < info.num_block_infos; i++){ | |
| 125 dev->block_size = MAX(dev->block_size, info.block_info[i].block_size); | |
| 126 } | |
| 127 | |
| 128 return true; | |
| 129 } else | |
| 130 return false; | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
131 } // flashiodev_init() |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
132 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
133 static Cyg_ErrNo |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
134 flashiodev_bread( cyg_io_handle_t handle, void *buf, cyg_uint32 *len, |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
135 cyg_uint32 pos) |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
136 { |
| 1706 | 137 struct cyg_devtab_entry *tab = (struct cyg_devtab_entry *)handle; |
| 138 struct flashiodev_priv_t *dev = (struct flashiodev_priv_t *)tab->priv; | |
| 139 | |
| 140 cyg_flashaddr_t startpos = dev->start + pos; | |
| 141 Cyg_ErrNo err; | |
| 142 | |
| 143 | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
144 #ifdef CYGPKG_INFRA_DEBUG // don't bother checking this all the time |
| 1706 | 145 cyg_flashaddr_t endpos = startpos + *len - 1; |
| 146 if ( startpos < dev->start ) | |
| 147 return -EINVAL; | |
| 148 if ( endpos > dev->end ) | |
| 149 return -EINVAL; | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
150 #endif |
| 1706 | 151 |
| 152 err = cyg_flash_read( startpos,(void *)buf, *len, NULL ); | |
| 153 | |
| 154 if ( err != CYG_FLASH_ERR_OK ) | |
| 155 err = -EIO; // just something sane | |
| 156 return err; | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
157 } // flashiodev_bread() |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
158 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
159 static Cyg_ErrNo |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
160 flashiodev_bwrite( cyg_io_handle_t handle, const void *buf, cyg_uint32 *len, |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
161 cyg_uint32 pos ) |
| 1706 | 162 { |
| 163 struct cyg_devtab_entry *tab = (struct cyg_devtab_entry *)handle; | |
| 164 struct flashiodev_priv_t *dev = (struct flashiodev_priv_t *)tab->priv; | |
| 165 | |
| 166 Cyg_ErrNo err; | |
| 167 cyg_flashaddr_t startpos = dev->start + pos; | |
| 168 | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
169 #ifdef CYGPKG_INFRA_DEBUG // don't bother checking this all the time |
| 1706 | 170 cyg_flashaddr_t endpos = startpos + *len - 1; |
| 171 if ( startpos < dev->start ) | |
| 172 return -EINVAL; | |
| 173 if ( endpos > dev->end ) | |
| 174 return -EINVAL; | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
175 #endif |
| 1706 | 176 err = cyg_flash_program( startpos, (void *)buf, *len, NULL ); |
| 177 | |
| 178 if ( err ) | |
| 179 err = -EIO; // just something sane | |
| 180 return err; | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
181 } // flashiodev_bwrite() |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
182 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
183 static Cyg_ErrNo |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
184 flashiodev_get_config( cyg_io_handle_t handle, |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
185 cyg_uint32 key, |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
186 void* buf, |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
187 cyg_uint32* len) |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
188 { |
| 1706 | 189 struct cyg_devtab_entry *tab = (struct cyg_devtab_entry *)handle; |
| 190 struct flashiodev_priv_t *dev = (struct flashiodev_priv_t *)tab->priv; | |
| 191 | |
| 192 switch (key) { | |
| 193 case CYG_IO_GET_CONFIG_FLASH_ERASE: | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
194 { |
| 1706 | 195 if ( *len != sizeof( cyg_io_flash_getconfig_erase_t ) ) |
| 196 return -EINVAL; | |
| 197 { | |
| 198 cyg_io_flash_getconfig_erase_t *e = (cyg_io_flash_getconfig_erase_t *)buf; | |
| 199 cyg_flashaddr_t startpos = dev->start + e->offset; | |
| 200 | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
201 #ifdef CYGPKG_INFRA_DEBUG // don't bother checking this all the time |
| 1706 | 202 cyg_flashaddr_t endpos = startpos + e->len - 1; |
| 203 if ( startpos < dev->start ) | |
| 204 return -EINVAL; | |
| 205 if ( endpos > dev->end ) | |
| 206 return -EINVAL; | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
207 #endif |
| 1706 | 208 e->flasherr = cyg_flash_erase( startpos, e->len, e->err_address ); |
| 209 } | |
| 210 return ENOERR; | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
211 } |
| 1706 | 212 case CYG_IO_GET_CONFIG_FLASH_DEVSIZE: |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
213 { |
| 1706 | 214 if ( *len != sizeof( cyg_io_flash_getconfig_devsize_t ) ) |
| 215 return -EINVAL; | |
| 216 { | |
| 217 cyg_io_flash_getconfig_devsize_t *d = | |
| 218 (cyg_io_flash_getconfig_devsize_t *)buf; | |
| 219 | |
| 220 d->dev_size = dev->end - dev->start; | |
| 221 } | |
| 222 return ENOERR; | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
223 } |
| 1706 | 224 |
| 225 case CYG_IO_GET_CONFIG_FLASH_BLOCKSIZE: | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
226 { |
| 1706 | 227 cyg_io_flash_getconfig_blocksize_t *b = |
| 228 (cyg_io_flash_getconfig_blocksize_t *)buf; | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
229 #ifdef CYGPKG_INFRA_DEBUG // don't bother checking this all the time |
| 1706 | 230 cyg_flashaddr_t startpos = dev->start + b->offset; |
| 231 | |
| 232 if ( startpos < dev->start ) | |
| 233 return -EINVAL; | |
| 234 if ( startpos > dev->end ) | |
| 235 return -EINVAL; | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
236 #endif |
| 1706 | 237 if ( *len != sizeof( cyg_io_flash_getconfig_blocksize_t ) ) |
| 238 return -EINVAL; | |
| 239 | |
| 240 // offset unused for now | |
| 241 b->block_size = dev->block_size; | |
| 242 return ENOERR; | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
243 } |
| 1706 | 244 |
| 245 default: | |
| 246 return -EINVAL; | |
| 247 } | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
248 } // flashiodev_get_config() |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
249 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
250 static Cyg_ErrNo |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
251 flashiodev_set_config( cyg_io_handle_t handle, |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
252 cyg_uint32 key, |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
253 const void* buf, |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
254 cyg_uint32* len) |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
255 { |
| 1706 | 256 struct cyg_devtab_entry *tab = (struct cyg_devtab_entry *)handle; |
| 257 struct flashiodev_priv_t *dev = (struct flashiodev_priv_t *)tab->priv; | |
| 258 | |
| 259 switch (key) { | |
| 260 case CYG_IO_SET_CONFIG_FLASH_FIS_NAME: | |
|
1411
5e52f3febc7d
Specify flash block device names at runtime - from David Woodhouse
gthomas
parents:
1391
diff
changeset
|
261 { |
| 1706 | 262 cyg_flashaddr_t flash_base; |
| 263 unsigned long size; | |
| 264 cyg_flash_info_t info; | |
| 265 cyg_uint32 i; | |
| 266 int stat; | |
| 267 | |
| 268 if(!CYGACC_CALL_IF_FLASH_FIS_OP(CYGNUM_CALL_IF_FLASH_FIS_GET_FLASH_BASE, | |
| 269 (char *)buf, &flash_base)) | |
| 270 return -ENOENT; | |
| 271 if(!CYGACC_CALL_IF_FLASH_FIS_OP(CYGNUM_CALL_IF_FLASH_FIS_GET_SIZE, | |
| 272 (char *)buf, &size)) | |
| 273 return -ENOENT; | |
| 274 | |
| 275 dev->start = flash_base; | |
| 276 dev->end = flash_base + size; | |
|
1411
5e52f3febc7d
Specify flash block device names at runtime - from David Woodhouse
gthomas
parents:
1391
diff
changeset
|
277 |
| 1706 | 278 stat = cyg_flash_get_info_addr(dev->start, &info); |
| 279 if (stat != CYG_FLASH_ERR_OK) { | |
| 280 return -ENOENT; | |
| 281 } | |
| 282 dev->block_size = 0; | |
| 283 for (i=0; i < info.num_block_infos; i++){ | |
| 284 dev->block_size = MAX(dev->block_size, info.block_info[i].block_size); | |
| 285 } | |
| 286 return ENOERR; | |
|
1411
5e52f3febc7d
Specify flash block device names at runtime - from David Woodhouse
gthomas
parents:
1391
diff
changeset
|
287 } |
| 1706 | 288 default: |
| 289 return -EINVAL; | |
| 290 } | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
291 } // flashiodev_set_config() |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
292 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
293 // get_config/set_config should be added later to provide the other flash |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
294 // operations possible, like erase etc. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
295 |
| 1706 | 296 #ifdef CYGNUM_IO_FLASH_BLOCK_CFG_FIS_1 |
| 297 static struct flashiodev_priv_t priv1 = { | |
| 298 0, // start | |
| 299 0, // end | |
| 300 1, // use_fis | |
| 301 0, // use_static | |
|
1711
3bafac44ac03
* src/flashiodev.c: Fix typo in macro and configuration options
asl
parents:
1706
diff
changeset
|
302 0, // use_offset |
| 1706 | 303 CYGDAT_IO_FLASH_BLOCK_FIS_NAME_1, |
| 304 0 // blocksize | |
| 305 }; | |
| 306 | |
| 307 #endif | |
| 308 #ifdef CYGNUM_IO_FLASH_BLOCK_CFG_STATIC_ABSOLUTE_1 | |
| 309 static struct flashiodev_priv_t priv1 = { | |
| 310 CYGNUM_IO_FLASH_BLOCK_ABSOLUTE_START_1, // start | |
| 311 CYGNUM_IO_FLASH_BLOCK_ABSOLUTE_START_1 + CYGNUM_IO_FLASH_BLOCK_ABSOLUTE_LENGTH_1, | |
| 312 0, // use_fis | |
| 313 1, // use_static | |
| 314 0, // use_offset | |
| 315 "", // fis_name | |
| 316 0 // blocksize | |
| 317 }; | |
|
1711
3bafac44ac03
* src/flashiodev.c: Fix typo in macro and configuration options
asl
parents:
1706
diff
changeset
|
318 #endif |
|
3bafac44ac03
* src/flashiodev.c: Fix typo in macro and configuration options
asl
parents:
1706
diff
changeset
|
319 #ifdef CYGNUM_IO_FLASH_BLOCK_CFG_STATIC_1 |
| 1706 | 320 static struct flashiodev_priv_t priv1 = { |
| 321 CYGNUM_IO_FLASH_BLOCK_OFFSET_1, // start | |
| 322 CYGNUM_IO_FLASH_BLOCK_LENGTH_1, // end | |
| 323 0, // use_fis | |
| 324 0, // use_static | |
| 325 1, // use_offset | |
| 326 "", // fis_name | |
| 327 0 // blocksize | |
| 328 }; | |
| 329 #endif | |
| 330 | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
331 BLOCK_DEVIO_TABLE( cyg_io_flashdev1_ops, |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
332 &flashiodev_bwrite, |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
333 &flashiodev_bread, |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
334 0, // no select |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
335 &flashiodev_get_config, |
|
1411
5e52f3febc7d
Specify flash block device names at runtime - from David Woodhouse
gthomas
parents:
1391
diff
changeset
|
336 &flashiodev_set_config |
| 1706 | 337 ); |
| 338 | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
339 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
340 BLOCK_DEVTAB_ENTRY( cyg_io_flashdev1, |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
341 CYGDAT_IO_FLASH_BLOCK_DEVICE_NAME_1, |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
342 0, |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
343 &cyg_io_flashdev1_ops, |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
344 &flashiodev_init, |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
345 0, // No lookup required |
| 1706 | 346 &priv1 ); |
| 347 | |
| 348 | |
| 349 #ifdef CYGSEM_IO_FLASH_BLOCK_DEVICE_2 | |
| 350 #ifdef CYGNUM_IO_FLASH_BLOCK_CFG_FIS_2 | |
| 351 static struct flashiodev_priv_t priv2 = { | |
| 352 0, // start | |
| 353 0, // end | |
| 354 1, // use_fis | |
| 355 0, // use_static | |
|
1711
3bafac44ac03
* src/flashiodev.c: Fix typo in macro and configuration options
asl
parents:
1706
diff
changeset
|
356 0, // use_offset |
| 1706 | 357 CYGDAT_IO_FLASH_BLOCK_FIS_NAME_2, |
| 358 0 // blocksize | |
| 359 }; | |
| 360 #endif | |
| 361 #ifdef CYGNUM_IO_FLASH_BLOCK_CFG_STATIC_ABSOLUTE_2 | |
| 362 static struct flashiodev_priv_t priv2 = { | |
| 363 CYGNUM_IO_FLASH_BLOCK_ABSOLUTE_START_2, // start | |
| 364 CYGNUM_IO_FLASH_BLOCK_ABSOLUTE_START_2 + CYGNUM_IO_FLASH_BLOCK_ABSOLUTE_LENGTH_2, | |
| 365 0, // use_fis | |
| 366 1, // use_static | |
| 367 0, // use_offset | |
| 368 "", // fis_name | |
| 369 0 // blocksize | |
| 370 }; | |
|
1711
3bafac44ac03
* src/flashiodev.c: Fix typo in macro and configuration options
asl
parents:
1706
diff
changeset
|
371 #endif |
|
3bafac44ac03
* src/flashiodev.c: Fix typo in macro and configuration options
asl
parents:
1706
diff
changeset
|
372 #ifdef CYGNUM_IO_FLASH_BLOCK_CFG_STATIC_2 |
| 1706 | 373 static struct flashiodev_priv_t priv2 = { |
| 374 CYGNUM_IO_FLASH_BLOCK_OFFSET_2, // start | |
| 375 CYGNUM_IO_FLASH_BLOCK_LENGTH_2, // end | |
| 376 0, // use_fis | |
| 377 0, // use_static | |
| 378 1, // use_offset | |
| 379 "", // fis_name | |
| 380 0 // blocksize | |
| 381 }; | |
| 382 #endif | |
| 383 | |
| 384 BLOCK_DEVTAB_ENTRY( cyg_io_flashdev2, | |
| 385 CYGDAT_IO_FLASH_BLOCK_DEVICE_NAME_2, | |
| 386 0, | |
| 387 &cyg_io_flashdev1_ops, | |
| 388 &flashiodev_init, | |
| 389 0, // No lookup required | |
| 390 &priv2 ); | |
| 391 #endif | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
392 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
393 // EOF flashiodev.c |
