GNU compliant library naming
[mw/milkymist.git] / software / libbase / cfcard.c
1 /*
2  * Milkymist VJ SoC (Software)
3  * Copyright (C) 2007, 2008, 2009 Sebastien Bourdeauducq
4  * 
5  * This program is free software: you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation, version 3 of the License.
8  * 
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  * 
14  * You should have received a copy of the GNU General Public License
15  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
16  */
17
18 #include <hw/systemace.h>
19 #include <libc.h>
20 #include <cfcard.h>
21 #include <console.h>
22
23 #define TIMEOUT 10000000
24
25 int cf_init()
26 {
27         int timeout;
28         
29         CSR_ACE_BUSMODE = ACE_BUSMODE_16BIT;
30         
31         if(!(CSR_ACE_STATUSL & ACE_STATUSL_CFDETECT)) return 0;
32         if((CSR_ACE_ERRORL != 0) || (CSR_ACE_ERRORH != 0)) return 0;
33         
34         CSR_ACE_CTLL |= ACE_CTLL_LOCKREQ;
35         timeout = TIMEOUT;
36         while((timeout > 0) && (!(CSR_ACE_STATUSL & ACE_STATUSL_MPULOCK))) timeout--;
37         if(timeout == 0) return 0;
38         
39         return 1;
40 }
41
42 int cf_readblock(unsigned int blocknr, unsigned char *buf)
43 {
44         unsigned short int *bufw = (unsigned short int *)buf;
45         int buffer_count;
46         int i;
47         int timeout;
48         
49         /* See p. 39 */
50         timeout = TIMEOUT;
51         while((timeout > 0) && (!(CSR_ACE_STATUSL & ACE_STATUSL_CFCMDRDY))) timeout--;
52         if(timeout == 0) return 0;
53         
54         CSR_ACE_MLBAL = blocknr & 0x0000ffff;
55         CSR_ACE_MLBAH = (blocknr & 0x0fff0000) >> 16;
56         
57         CSR_ACE_SECCMD = ACE_SECCMD_READ|0x01;
58         
59         CSR_ACE_CTLL |= ACE_CTLL_CFGRESET;
60         
61         buffer_count = 16;
62         while(buffer_count > 0) {
63                 timeout = TIMEOUT;
64                 while((timeout > 0) && (!(CSR_ACE_STATUSL & ACE_STATUSL_DATARDY))) timeout--;
65                 if(timeout == 0) return 0;
66
67                 for(i=0;i<16;i++) {
68                         *bufw = CSR_ACE_DATA;
69                         /* SystemACE data buffer access seems little-endian. */
70                         *bufw = ((*bufw & 0xff00) >> 8) | ((*bufw & 0x00ff) << 8);
71                         bufw++;
72                 }
73                         
74                 buffer_count--;
75         }
76         
77         CSR_ACE_CTLL &= ~ACE_CTLL_CFGRESET;
78         
79         return 1;
80 }
81
82 void cf_done()
83 {
84         CSR_ACE_CTLL &= ~ACE_CTLL_LOCKREQ;
85 }