Root/target/linux/at91/image/dfboot/src/dataflash.c

1/*----------------------------------------------------------------------------
2 * ATMEL Microcontroller Software Support - ROUSSET -
3 *----------------------------------------------------------------------------
4 * The software is delivered "AS IS" without warranty or condition of any
5 * kind, either express, implied or statutory. This includes without
6 * limitation any warranty or condition with respect to merchantability or
7 * fitness for any particular purpose, or against the infringements of
8 * intellectual property rights of others.
9 *----------------------------------------------------------------------------
10 * File Name : dataflash.c
11 * Object : High level functions for the dataflash
12 * Creation : HIi 10/10/2003
13 *----------------------------------------------------------------------------
14 */
15#include "config.h"
16#include "stdio.h"
17#include "dataflash.h"
18
19
20AT91S_DATAFLASH_INFO dataflash_info[CFG_MAX_DATAFLASH_BANKS];
21static AT91S_DataFlash DataFlashInst;
22
23int cs[][CFG_MAX_DATAFLASH_BANKS] = {
24    {CFG_DATAFLASH_LOGIC_ADDR_CS0, 0}, /* Logical adress, CS */
25    {CFG_DATAFLASH_LOGIC_ADDR_CS3, 3}
26};
27
28int AT91F_DataflashInit(void)
29{
30    int i;
31    int dfcode;
32    int Nb_device = 0;
33        
34    AT91F_SpiInit();
35
36    for (i = 0; i < CFG_MAX_DATAFLASH_BANKS; i++) {
37        dataflash_info[i].id = 0;
38        dataflash_info[i].Device.pages_number = 0;
39        dfcode = AT91F_DataflashProbe (cs[i][1], &dataflash_info[i].Desc);
40
41        switch (dfcode) {
42        case AT45DB161:
43            dataflash_info[i].Device.pages_number = 4096;
44            dataflash_info[i].Device.pages_size = 528;
45            dataflash_info[i].Device.page_offset = 10;
46            dataflash_info[i].Device.byte_mask = 0x300;
47            dataflash_info[i].Device.cs = cs[i][1];
48            dataflash_info[i].Desc.DataFlash_state = IDLE;
49            dataflash_info[i].logical_address = cs[i][0];
50            dataflash_info[i].id = dfcode;
51            Nb_device++;
52            break;
53
54        case AT45DB321:
55            dataflash_info[i].Device.pages_number = 8192;
56            dataflash_info[i].Device.pages_size = 528;
57            dataflash_info[i].Device.page_offset = 10;
58            dataflash_info[i].Device.byte_mask = 0x300;
59            dataflash_info[i].Device.cs = cs[i][1];
60            dataflash_info[i].Desc.DataFlash_state = IDLE;
61            dataflash_info[i].logical_address = cs[i][0];
62            dataflash_info[i].id = dfcode;
63            Nb_device++;
64            break;
65
66        case AT45DB642:
67            dataflash_info[i].Device.pages_number = 8192;
68            dataflash_info[i].Device.pages_size = 1056;
69            dataflash_info[i].Device.page_offset = 11;
70            dataflash_info[i].Device.byte_mask = 0x700;
71            dataflash_info[i].Device.cs = cs[i][1];
72            dataflash_info[i].Desc.DataFlash_state = IDLE;
73            dataflash_info[i].logical_address = cs[i][0];
74            dataflash_info[i].id = dfcode;
75            Nb_device++;
76            break;
77        case AT45DB128:
78            dataflash_info[i].Device.pages_number = 16384;
79            dataflash_info[i].Device.pages_size = 1056;
80            dataflash_info[i].Device.page_offset = 11;
81            dataflash_info[i].Device.byte_mask = 0x700;
82            dataflash_info[i].Device.cs = cs[i][1];
83            dataflash_info[i].Desc.DataFlash_state = IDLE;
84            dataflash_info[i].logical_address = cs[i][0];
85            dataflash_info[i].id = dfcode;
86            Nb_device++;
87            break;
88        default:
89            break;
90        }
91    }
92    return (Nb_device);
93}
94
95
96void AT91F_DataflashPrintInfo(void)
97{
98    int i;
99    for (i = 0; i < CFG_MAX_DATAFLASH_BANKS; i++) {
100        if (dataflash_info[i].id != 0) {
101            printf ("DF:AT45DB");
102            switch (dataflash_info[i].id) {
103            case AT45DB161:
104                printf ("161");
105                break;
106
107            case AT45DB321:
108                printf ("321");
109                break;
110
111            case AT45DB642:
112                printf ("642");
113                break;
114            case AT45DB128:
115                printf ("128");
116                break;
117            }
118
119            printf ("\n# PG: %6d\n"
120                "PG SZ: %6d\n"
121                "SZ=%8d bytes\n"
122                "ADDR: %08X\n",
123                (unsigned int) dataflash_info[i].Device.pages_number,
124                (unsigned int) dataflash_info[i].Device.pages_size,
125                (unsigned int) dataflash_info[i].Device.pages_number *
126                dataflash_info[i].Device.pages_size,
127                (unsigned int) dataflash_info[i].logical_address);
128        }
129    }
130}
131
132
133/*------------------------------------------------------------------------------*/
134/* Function Name : AT91F_DataflashSelect */
135/* Object : Select the correct device */
136/*------------------------------------------------------------------------------*/
137static AT91PS_DataFlash AT91F_DataflashSelect(AT91PS_DataFlash pFlash,
138                                              unsigned int *addr)
139{
140    char addr_valid = 0;
141    int i;
142
143    for (i = 0; i < CFG_MAX_DATAFLASH_BANKS; i++)
144        if ((*addr & 0xFF000000) == dataflash_info[i].logical_address) {
145            addr_valid = 1;
146            break;
147        }
148    if (!addr_valid) {
149        pFlash = (AT91PS_DataFlash) 0;
150        return pFlash;
151    }
152    pFlash->pDataFlashDesc = &(dataflash_info[i].Desc);
153    pFlash->pDevice = &(dataflash_info[i].Device);
154    *addr -= dataflash_info[i].logical_address;
155    return (pFlash);
156}
157
158
159/*------------------------------------------------------------------------------*/
160/* Function Name : read_dataflash */
161/* Object : dataflash memory read */
162/*------------------------------------------------------------------------------*/
163int read_dataflash(unsigned long addr, unsigned long size, char *result)
164{
165    unsigned int AddrToRead = addr;
166    AT91PS_DataFlash pFlash = &DataFlashInst;
167
168    pFlash = AT91F_DataflashSelect (pFlash, &AddrToRead);
169    if (pFlash == 0)
170        return -1;
171
172    return (AT91F_DataFlashRead(pFlash, AddrToRead, size, result));
173}
174
175
176/*-----------------------------------------------------------------------------*/
177/* Function Name : write_dataflash */
178/* Object : write a block in dataflash */
179/*-----------------------------------------------------------------------------*/
180int write_dataflash(unsigned long addr_dest, unsigned int addr_src,
181                    unsigned int size)
182{
183    unsigned int AddrToWrite = addr_dest;
184    AT91PS_DataFlash pFlash = &DataFlashInst;
185
186    pFlash = AT91F_DataflashSelect(pFlash, &AddrToWrite);
187    if (AddrToWrite == -1)
188        return -1;
189
190    return AT91F_DataFlashWrite(pFlash, (unsigned char *) addr_src, AddrToWrite, size);
191}
192
193/*-----------------------------------------------------------------------------*/
194/* Function Name : erase_dataflash */
195/* Object : Erase entire dataflash */
196/*-----------------------------------------------------------------------------*/
197int erase_dataflash(unsigned long addr_dest)
198{
199    unsigned int AddrToWrite = addr_dest;
200    AT91PS_DataFlash pFlash = &DataFlashInst;
201
202    pFlash = AT91F_DataflashSelect (pFlash, &AddrToWrite);
203    if (AddrToWrite == -1)
204        return -1;
205
206    return AT91F_DataFlashErase(pFlash);
207}
208
209

Archive Download this file



interactive