OpenCores
URL https://opencores.org/ocsvn/usb_nand_reader/usb_nand_reader/trunk

Subversion Repositories usb_nand_reader

[/] [usb_nand_reader/] [trunk/] [pc/] [actions.c] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 pradd
 
2
#include <stdio.h>
3
#include <stdlib.h>
4
#include <string.h>
5
#include <libusb-1.0/libusb.h>
6
#include "include/opcodes.h"
7
#include "include/actions.h"
8
#include "include/nand_vendors.h"
9
 
10
unsigned char ioBuffer[64];
11
int dataTransfered;
12
 
13
int
14
usb_write(libusb_device_handle* usb, unsigned char* data, int len)
15
{
16
        int ds;
17
        int i = 0;
18
        int l = (len < 64)? 64 : len;
19
 
20
        while(i < l)
21
        {
22
                libusb_bulk_transfer(usb, 0x01, data + i, l - i, &ds, 1000);
23
                i += ds;
24
        }
25
        return i;
26
}
27
 
28
int
29
usb_read(libusb_device_handle* usb, unsigned char* data, int len)
30
{
31
        int ds;
32
        int i = 0, r;
33
        if(len % 64 != 0)
34
        {
35
                fprintf(stderr, "\nIncorrect read length\n");
36
                return 0;
37
        }
38
        while(i < len)
39
        {
40
                if(0 > (r = libusb_bulk_transfer(usb, 0x81, data + i, len - i, &ds, 10000)))
41
                {
42
                        fprintf(stderr, "libusb_bulk_transfer() returned %d\n", r);
43
                        //exit(-4);
44
                }
45
                i += ds;
46
                if(0 == ds)
47
                        exit(-3);
48
        }
49
        return i;
50
}
51
 
52
USB_ACTION(nand_reset)
53
{
54
        ioBuffer[0] = NAND_CHIP_RESET;
55
        usb_write(usb, ioBuffer, 1);
56
        return 0;
57
}
58
 
59
USB_ACTION(nand_enable, int dieIndex)
60
{
61
        ioBuffer[0] = NAND_CHIP_ENABLE;
62
        ioBuffer[1] = (unsigned char)(dieIndex & 3);
63
        usb_write(usb, ioBuffer, 2);
64
        return 0;
65
}
66
 
67
USB_ACTION(nand_disble)
68
{
69
        ioBuffer[0] = NAND_CHIP_DISABLE;
70
        usb_write(usb, ioBuffer, 1);
71
        return 0;
72
}
73
 
74
USB_ACTION(nand_read_id, unsigned char* idBuffer)
75
{
76
        ioBuffer[0] = NAND_CHIP_READ_ID;
77
        usb_write(usb, ioBuffer, 1);
78
        usb_read(usb, ioBuffer, 64);
79
        memcpy(idBuffer, ioBuffer, 5);
80
        return 0;
81
}
82
 
83
USB_ACTION(nand_is_onfi, unsigned char* signature)
84
{
85
        ioBuffer[0] = NAND_CHIP_READ_ID_ONFI;
86
        usb_write(usb, ioBuffer, 1);
87
        usb_read(usb, ioBuffer, 64);
88
        memcpy(signature, ioBuffer, 4);
89
        if(ioBuffer[0] == 'O' && ioBuffer[1] == 'N' && ioBuffer[2] == 'F' && ioBuffer[3] == 'I')
90
                return 1;
91
        return 0;
92
}
93
 
94
USB_ACTION(nand_read_onfi_param_page, unsigned char* paramPageBuffer)
95
{
96
        ioBuffer[0] = NAND_CHIP_READ_PARAM_PAGE;
97
        usb_write(usb, ioBuffer, 1);
98
        usb_read(usb, paramPageBuffer, 256);
99
        return 0;
100
}
101
 
102
USB_ACTION(nand_set_config_data, pnand_t nand)
103
{
104
        ioBuffer[0] = NAND_SET_CONFIG_DATA;
105
        *(int*)(&ioBuffer[1]) = nand->bytesPerPage + nand->oobPerPage;
106
        ioBuffer[5] = (unsigned char)(nand->addressCycles & 0xff);
107
        ioBuffer[6] = (unsigned char)(nand->busWidth);
108
        usb_write(usb, ioBuffer, 6);
109
        return 0;
110
}
111
 
112
USB_ACTION(nand_read_page, unsigned int pageAddress, pnand_t nand)
113
{
114
        //struct timespec start = {0, 0}, end = {0, 0};
115
        ioBuffer[0] = NAND_CHIP_READ_PAGE;
116
        ioBuffer[1] = ioBuffer[2] = 0;
117
        *(unsigned int*)(&ioBuffer[3]) = (pageAddress & 0x00ffffff);
118
        //clock_gettime(CLOCK_MONOTONIC, &start);
119
        usb_write(usb, ioBuffer, 64);
120
        //printf("read %d bytes\n", usb_read(usb, nand->pageBuffer, nand->bytesPerPage + nand->oobPerPage));
121
 
122
        usb_read(usb, nand->pageBuffer, nand->bytesPerPage + nand->oobPerPage);
123
        //clock_gettime(CLOCK_MONOTONIC, &end);
124
        //printf("\r\tPage read in %.10f seconds.", ((double)end.tv_sec + 1.0e-9 * end.tv_nsec) - ((double)start.tv_sec + 1.0e-9 * start.tv_nsec));
125
        //fflush(stdout);
126
        return 0;
127
}
128
 
129
USB_ACTION(nand_read_page_cache, unsigned int startPageAddress, int pageCount, FILE* storeTo, pnand_t nand)
130
{
131
        int currentPage, blocks = 0;
132
        unsigned int sa = startPageAddress;
133
 
134
        if(0 != pageCount % nand->pagesPerBlock)
135
                return -1;
136
 
137
        while(blocks < pageCount / nand->pagesPerBlock)
138
        {
139
                fprintf(stderr,"\rBlock #%d (%0.4f%%)", blocks, (float)blocks / ((float)(pageCount / nand->pagesPerBlock) / 100.0f));
140
                ioBuffer[0] = NAND_CHIP_READ_CACHE_SEQ;
141
                ioBuffer[1] = ioBuffer[2] = 0;
142
                *(unsigned int*)(&ioBuffer[3]) = (sa & 0x00ffffff);
143
                *(int*)(&ioBuffer[6]) = nand->pagesPerBlock;
144
                usb_write(usb, ioBuffer, 64);
145
 
146
                for(currentPage = 0; currentPage < nand->pagesPerBlock; currentPage++)
147
                {
148
                        usb_read(usb, nand->pageBuffer, nand->bytesPerPage + nand->oobPerPage);
149
                        if(NULL != storeTo)
150
                                store_page(storeTo, nand);
151
                        //fprintf(stderr,"\rBlock #%d %0.2f%% completed", blocks, (float)currentPage / ((float)nand->pagesPerBlock / 100.0f));
152
                }
153
                blocks++;
154
                sa += nand->pagesPerBlock;
155
        }
156
        fprintf(stderr, "\n");
157
        return 0;
158
}
159
 
160
USB_ACTION(nand_read_status, unsigned char* status)
161
{
162
        ioBuffer[0] = NAND_CHIP_READ_STATUS;
163
        usb_write(usb, ioBuffer, 64);
164
        usb_read(usb, ioBuffer, 64);
165
        if(status)
166
                *status = ioBuffer[0];
167
        return (int)ioBuffer[0];
168
}
169
 
170
USB_ACTION(nand_read_status_enhanced, unsigned int address, unsigned char* status)
171
{
172
        ioBuffer[0] = NAND_CHIP_READ_STATUS;
173
        *(unsigned int*)(&ioBuffer[1]) = address & 0xffffff;
174
        usb_write(usb, ioBuffer, 64);
175
        usb_read(usb, ioBuffer, 64);
176
        if(status)
177
                *status = ioBuffer[0];
178
        return (int)ioBuffer[0];
179
}
180
 
181
USB_ACTION(nand_read_unique_id, unsigned char* uid)
182
{
183
        ioBuffer[0] = NAND_CHIP_READ_UNIQUE_ID;
184
        usb_write(usb, ioBuffer, 64);
185
        usb_read(usb, ioBuffer, 64);
186
        memcpy(uid, ioBuffer, 64);
187
        return 0;
188
}
189
 
190
int nand_check_uid(unsigned char* buffer)
191
{
192
        int i;
193
        for(i = 0; i < 16; i++)
194
        {
195
                if(0xFF != (*(buffer + i) ^ *(buffer + i + 16)))
196
                        return 0;
197
        }
198
        return 1;
199
}
200
 
201
 
202
USB_ACTION(nand_block_erase, unsigned int blockAddress)
203
{
204
        ioBuffer[0] = NAND_CHIP_BLOCK_ERASE;
205
        *(unsigned int*)(&ioBuffer[1]) = (blockAddress & 0x00ffffff);
206
        usb_write(usb, ioBuffer, 64);
207
        return 0;
208
}
209
 
210
USB_ACTION(nand_toggle_wp)
211
{
212
        ioBuffer[0] = NAND_CHIP_TOGGLE_WP;
213
        usb_write(usb, ioBuffer, 64);
214
        return 0;
215
}
216
 
217
USB_ACTION(nand_page_program, unsigned int pageAddress, pnand_t nand)
218
{
219
        //int i;
220
 
221
        ioBuffer[0] = NAND_CHIP_PAGE_PROGRAM;
222
        ioBuffer[1] = ioBuffer[2] = 0;
223
        *(unsigned int*)(&ioBuffer[3]) = (pageAddress & 0x00ffffff);
224
        usb_write(usb, ioBuffer, 64);
225
        /*
226
        for(i = 0; i < nand->bytesPerPage + nand->oobPerPage; i += 64)
227
        {
228
                fprintf(stderr, "Written %d bytes\n", usb_write(usb, nand->pageBuffer + i, 64));
229
        }
230
         */
231
 
232
        fprintf(stderr, "Written %d bytes\n", usb_write(usb, nand->pageBuffer, nand->bytesPerPage + nand->oobPerPage));
233
        return 0;
234
}

powered by: WebSVN 2.1.0

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