Subversion Repositories freemyipod

Rev

Rev 253 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 253 Rev 255
Line 91... Line 91...
91
        if (TIME_AFTER(USEC_TIMER, timeout)) return 1;
91
        if (TIME_AFTER(USEC_TIMER, timeout)) return 1;
92
    FMCSTAT = FMCSTAT_RBBDONE;
92
    FMCSTAT = FMCSTAT_RBBDONE;
93
    return 0;
93
    return 0;
94
}
94
}
95
 
95
 
96
static void nand_wait_cmddone(void)
96
static uint32_t nand_wait_cmddone(void)
97
{
97
{
-
 
98
    uint32_t timeout = USEC_TIMER + 20000;
98
    while ((FMCSTAT & FMCSTAT_CMDDONE) == 0);
99
    while ((FMCSTAT & FMCSTAT_CMDDONE) == 0)
-
 
100
        if (TIME_AFTER(USEC_TIMER, timeout)) return 1;
99
    FMCSTAT = FMCSTAT_CMDDONE;
101
    FMCSTAT = FMCSTAT_CMDDONE;
-
 
102
    return 0;
100
}
103
}
101
 
104
 
102
static void nand_wait_addrdone(void)
105
static uint32_t nand_wait_addrdone(void)
103
{
106
{
-
 
107
    uint32_t timeout = USEC_TIMER + 20000;
104
    while ((FMCSTAT & FMCSTAT_ADDRDONE) == 0);
108
    while ((FMCSTAT & FMCSTAT_ADDRDONE) == 0)
-
 
109
        if (TIME_AFTER(USEC_TIMER, timeout)) return 1;
105
    FMCSTAT = FMCSTAT_ADDRDONE;
110
    FMCSTAT = FMCSTAT_ADDRDONE;
-
 
111
    return 0;
106
}
112
}
107
 
113
 
108
static void nand_wait_chip_ready(uint32_t bank)
114
static uint32_t nand_wait_chip_ready(uint32_t bank)
109
{
115
{
-
 
116
    uint32_t timeout = USEC_TIMER + 20000;
110
    while ((FMCSTAT & (FMCSTAT_BANK0READY << bank)) == 0);
117
    while ((FMCSTAT & (FMCSTAT_BANK0READY << bank)) == 0)
-
 
118
        if (TIME_AFTER(USEC_TIMER, timeout)) return 1;
111
    FMCSTAT = (FMCSTAT_BANK0READY << bank);
119
    FMCSTAT = (FMCSTAT_BANK0READY << bank);
-
 
120
    return 0;
112
}
121
}
113
 
122
 
114
static void nand_set_fmctrl0(uint32_t bank, uint32_t flags)
123
static void nand_set_fmctrl0(uint32_t bank, uint32_t flags)
115
{
124
{
116
    FMCTRL0 = (nand_tunk1 << 16) | (nand_twp << 12)
125
    FMCTRL0 = (nand_tunk1 << 16) | (nand_twp << 12)
Line 134... Line 143...
134
 
143
 
135
uint32_t nand_reset(uint32_t bank)
144
uint32_t nand_reset(uint32_t bank)
136
{
145
{
137
    nand_set_fmctrl0(bank, 0);
146
    nand_set_fmctrl0(bank, 0);
138
    if (nand_send_cmd(NAND_CMD_RESET)) return 1;
147
    if (nand_send_cmd(NAND_CMD_RESET)) return 1;
139
    nand_wait_chip_ready(bank);
148
    if (nand_wait_chip_ready(bank)) return 1;
140
    FMCTRL1 = FMCTRL1_CLEARRFIFO | FMCTRL1_CLEARWFIFO;
149
    FMCTRL1 = FMCTRL1_CLEARRFIFO | FMCTRL1_CLEARWFIFO;
141
    sleep(1000);
150
    sleep(1000);
142
    return 0;
151
    return 0;
143
}
152
}
144
 
153
 
Line 210... Line 219...
210
    if (nand_reset(bank)) return 0xFFFFFFFF;
219
    if (nand_reset(bank)) return 0xFFFFFFFF;
211
    if (nand_send_cmd(0x90)) return 0xFFFFFFFF;
220
    if (nand_send_cmd(0x90)) return 0xFFFFFFFF;
212
    FMANUM = 0;
221
    FMANUM = 0;
213
    FMADDR0 = 0;
222
    FMADDR0 = 0;
214
    FMCTRL1 = FMCTRL1_DOTRANSADDR;
223
    FMCTRL1 = FMCTRL1_DOTRANSADDR;
215
    nand_wait_cmddone();
224
    if (nand_wait_cmddone()) return 0xFFFFFFFF;
216
    FMDNUM = 4;
225
    FMDNUM = 4;
217
    FMCTRL1 = FMCTRL1_DOREADDATA;
226
    FMCTRL1 = FMCTRL1_DOREADDATA;
218
    nand_wait_addrdone();
227
    if (nand_wait_addrdone()) return 0xFFFFFFFF;
219
    result = FMFIFO;
228
    result = FMFIFO;
220
    FMCTRL1 = FMCTRL1_CLEARRFIFO;
229
    FMCTRL1 = FMCTRL1_CLEARRFIFO;
221
    return result;
230
    return result;
222
}
231
}
223
 
232
 
Line 283... Line 292...
283
        for (j = 0; ; j++)
292
        for (j = 0; ; j++)
284
        {
293
        {
285
            if (j == NAND_DEVICEINFOTABLE_ENTRIES) break;
294
            if (j == NAND_DEVICEINFOTABLE_ENTRIES) break;
286
            else if (nand_deviceinfotable[j].id == type)
295
            else if (nand_deviceinfotable[j].id == type)
287
            {
296
            {
-
 
297
                nand_tunk1 = nand_deviceinfotable[j].tunk1;
-
 
298
                nand_twp = nand_deviceinfotable[j].twp;
288
                nand_type[i] = j;
299
                nand_type[i] = j;
289
                break;
300
                break;
290
            }
301
            }
291
        }
302
        }
292
    }
303
    }
293
    nand_tunk1 = nand_deviceinfotable[nand_type[0]].tunk1;
-
 
294
    nand_twp = nand_deviceinfotable[nand_type[0]].twp;
-
 
295
    return 0;
304
    return 0;
296
}
305
}