Products > Programming
help calculate Micron NAND on die ECC
(1/1)
carver:
Hi. I can't google how to check ECC in a read NAND image.
NAND chip from Micron, 29F2G16
for READ ID (90h) command gives 2C CA 90 D5 86 00 00 00
according to the PDF, the bits say that 4-bit ECC.
512+4 (data) + 4 (spare/"not_used") + 8 (parity/ECC) bytes
and Internal ECC enabled
an old micron decoder with pudn/google calculate
bch_encoder_0x201b.exe -m 13 -k 4128 -t 4 <noname.txt // -> 07ED34D14242C
bch_encoder_0x25af.exe -m 13 -k 4128 -t 4 <noname.txt // -> EDE66E50C82B7
depending on the polynomial, but not A3BE308501E09E8A as in my dump
below is an example of a sector. maybe someone can help. thanks.
--- Code: ---00000000 74 65 6d 20 66 6f 75 6e 64 20 61 74 20 62 6c 6f |tem found at blo|
00000010 63 6b 20 25 64 0a 00 00 3c 35 3e 52 41 4d 44 49 |ck %d...<5>RAMDI|
00000020 53 4b 3a 20 43 6f 75 6c 64 6e 27 74 20 66 69 6e |SK: Couldn't fin|
00000030 64 20 76 61 6c 69 64 20 52 41 4d 20 64 69 73 6b |d valid RAM disk|
00000040 20 69 6d 61 67 65 20 73 74 61 72 74 69 6e 67 20 | image starting |
00000050 61 74 20 25 64 2e 0a 00 3c 33 3e 52 41 4d 44 49 |at %d...<3>RAMDI|
00000060 53 4b 3a 20 43 6f 75 6c 64 6e 27 74 20 61 6c 6c |SK: Couldn't all|
00000070 6f 63 61 74 65 20 67 7a 69 70 20 62 75 66 66 65 |ocate gzip buffe|
00000080 72 0a 00 00 3c 33 3e 52 41 4d 44 49 53 4b 3a 20 |r...<3>RAMDISK: |
00000090 43 6f 75 6c 64 6e 27 74 20 61 6c 6c 6f 63 61 74 |Couldn't allocat|
000000a0 65 20 67 7a 69 70 20 77 69 6e 64 6f 77 0a 00 00 |e gzip window...|
000000b0 62 61 64 20 67 7a 69 70 20 6d 61 67 69 63 20 6e |bad gzip magic n|
000000c0 75 6d 62 65 72 73 00 00 69 6e 74 65 72 6e 61 6c |umbers..internal|
000000d0 20 65 72 72 6f 72 2c 20 69 6e 76 61 6c 69 64 20 | error, invalid |
000000e0 6d 65 74 68 6f 64 00 00 49 6e 70 75 74 20 69 73 |method..Input is|
000000f0 20 65 6e 63 72 79 70 74 65 64 00 00 4d 75 6c 74 | encrypted..Mult|
00000100 69 20 70 61 72 74 20 69 6e 70 75 74 00 00 00 00 |i part input....|
00000110 49 6e 70 75 74 20 68 61 73 20 69 6e 76 61 6c 69 |Input has invali|
00000120 64 20 66 6c 61 67 73 00 69 6e 76 61 6c 69 64 20 |d flags.invalid |
00000130 63 6f 6d 70 72 65 73 73 65 64 20 66 6f 72 6d 61 |compressed forma|
00000140 74 20 28 65 72 72 3d 31 29 00 00 00 69 6e 76 61 |t (err=1)...inva|
00000150 6c 69 64 20 63 6f 6d 70 72 65 73 73 65 64 20 66 |lid compressed f|
00000160 6f 72 6d 61 74 20 28 65 72 72 3d 32 29 00 00 00 |ormat (err=2)...|
00000170 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 00 00 00 |out of memory...|
00000180 6f 75 74 20 6f 66 20 69 6e 70 75 74 20 64 61 74 |out of input dat|
00000190 61 00 00 00 69 6e 76 61 6c 69 64 20 63 6f 6d 70 |a...invalid comp|
000001a0 72 65 73 73 65 64 20 66 6f 72 6d 61 74 20 28 6f |ressed format (o|
000001b0 74 68 65 72 29 00 00 00 63 72 63 20 65 72 72 6f |ther)...crc erro|
000001c0 72 00 00 00 6c 65 6e 67 74 68 20 65 72 72 6f 72 |r...length error|
000001d0 00 00 00 00 52 41 4d 44 49 53 4b 3a 20 69 6d 61 |....RAMDISK: ima|
000001e0 67 65 20 74 6f 6f 20 62 69 67 21 20 28 25 64 4b |ge too big! (%dK|
000001f0 69 42 2f 25 6c 64 4b 69 42 29 0a 00 2f 69 6e 69 |iB/%ldKiB)../ini|
00000200 ff ff ff ff ff ff ff ff a3 be 30 85 01 e0 9e 8a |..........0.....|
--- End code ---
DavidAlfa:
You don't have any ECC algorithm in the nand itself, it only has extra spare space for storing it, and the host writes whatever on it:
--- Quote ---The MT29F2G device contains 2,048 blocks. Each block is subdivided into 64 programmable pages. Each page consists of 2,112 bytes. The pages are further divided into a
2,048-byte data storage region with a separate 64-byte area. The 64-byte area is typically used for error management functions.
--- End quote ---
Commands don't have ECC.
READ ID is a 5-byte command, so: 2C CA 90 D5 86
Byte 0: Manufacturer ID 0x2C = Micron
Byte 1: Device ID 0xCA = MT29F2G16AAD
...
Only "Read Unique ID (EDh)" has a sort-of protection system:
--- Quote ---Many controllers use proprietary error correction code (ECC) schemes; thus, it is not
possible for Micron to protect unique ID data with factory-programmed ECC.
However, to ensure data integrity, Micron programs the noted NAND Flash devices with a 16-byte
unique ID, beginning at byte 0 of the page, then follows with 16 bytes of complement ID.
These 32 bytes of data are then repeated a total of 16 times, such that the last byte of the
last copy of complement unique ID resides at byte 511 in the page.
The user can simply XOR the first copy of the unique ID and its complement. If the result is “1,” the unique ID is good.
In the unlikely event that the result is non-zero, the user can repeat the XOR operation on a subsequent copy of the unique ID data.
--- End quote ---
You'll need to know the ECC used in the system where you took the nand from.
Did you see this?
https://github.com/SySS-Research/nand-dump-tools
carver:
sorry for the silence, I forgot to subscribe to the topic.
thanks for the link, I will try to search for the algorithm there.
but I wrote everything right, in my case, it is the internal ECC in the NAND Micron.
it does not depend on the OS in any way (
I use JTAG and, and simple loader (code from MPC8321 manual) to work with NAND.
I erase flash, read all 0xFF, write 0x800, and read 0x800 data + 0x40 ECC back.
so I wrote above, the bits indicate hardware ECC in NAND, and CPU like MPC8321 - haven't ECC.
on the Internet - there was an ECC Micron algorithm, but it gives me different values ((
Micron is a well-known manufacturer, Linux/Uboot mentions "on die ECC",
so I was hoping that someone might have already solved this ECC or would point out my mistake.
p,s, yea, 2048+64 = 512+512+512+512+4+4+4+4+4+4+4+4+8+8+8+8,
so I post only one 528 block, where 516 bytes - data, 4 bytes - "not used", 8 bytes - ECC.
..oh, need fix my first post. 512->512+4(for data).
DavidAlfa:
It's strange. I got at least 3 different datasheets with different data.
I guess due the AAD/ABD/AABWP/BABWP/etc variations.
The last datasheet shows what you say.
ECC is done by on-die hardware, so after enabling the ECC bit, it should be managed automatically when writing/reading data?
So, unless the data is damaged beyond what ECC can repair, you should be getting correct data?
I suspect you should only read or write to the first 2048 Bytes, leaving the rest for the ECC.
So writing 2048 bytes to a page should "refresh" the ECC data?
carver:
yea. at my pdf 2C CA 90 D5 86 = Micron MT29F2G16ABAEA.
before I save forum and gogle space, and post only 512+16 bytes, here full 2112 bytes (2048 + 64 bytes)
--- Code: ---00000000 65 72 72 75 70 74 73 00 64 69 73 61 62 6c 65 64 |errupts.disabled|
00000010 20 68 61 72 64 20 69 6e 74 65 72 72 75 70 74 73 | hard interrupts|
00000020 00 00 00 00 3c 34 3e 69 6e 69 74 63 61 6c 6c 20 |....<4>initcall |
00000030 61 74 20 30 78 25 70 00 3a 20 72 65 74 75 72 6e |at 0x%p.: return|
00000040 65 64 20 77 69 74 68 20 25 73 0a 00 69 6e 69 74 |ed with %s..init|
00000050 2f 6d 61 69 6e 2e 63 00 2f 64 65 76 2f 63 6f 6e |/main.c./dev/con|
00000060 73 6f 6c 65 00 00 00 00 3c 34 3e 57 61 72 6e 69 |sole....<4>Warni|
00000070 6e 67 3a 20 75 6e 61 62 6c 65 20 74 6f 20 6f 70 |ng: unable to op|
00000080 65 6e 20 61 6e 20 69 6e 69 74 69 61 6c 20 63 6f |en an initial co|
00000090 6e 73 6f 6c 65 2e 0a 00 3c 34 3e 46 61 69 6c 65 |nsole...<4>Faile|
000000a0 64 20 74 6f 20 65 78 65 63 75 74 65 20 25 73 0a |d to execute %s.|
000000b0 00 00 00 00 3c 34 3e 46 61 69 6c 65 64 20 74 6f |....<4>Failed to|
000000c0 20 65 78 65 63 75 74 65 20 25 73 2e 20 20 41 74 | execute %s. At|
000000d0 74 65 6d 70 74 69 6e 67 20 64 65 66 61 75 6c 74 |tempting default|
000000e0 73 2e 2e 2e 0a 00 00 00 2f 73 62 69 6e 2f 69 6e |s......./sbin/in|
000000f0 69 74 00 00 2f 65 74 63 2f 69 6e 69 74 00 00 00 |it../etc/init...|
00000100 2f 62 69 6e 2f 69 6e 69 74 00 00 00 2f 62 69 6e |/bin/init.../bin|
00000110 2f 73 68 00 4e 6f 20 69 6e 69 74 20 66 6f 75 6e |/sh.No init foun|
00000120 64 2e 20 20 54 72 79 20 70 61 73 73 69 6e 67 20 |d. Try passing |
00000130 69 6e 69 74 3d 20 6f 70 74 69 6f 6e 20 74 6f 20 |init= option to |
00000140 6b 65 72 6e 65 6c 2e 00 3c 34 3e 50 61 72 61 6d |kernel..<4>Param|
00000150 65 74 65 72 20 25 73 20 69 73 20 6f 62 73 6f 6c |eter %s is obsol|
00000160 65 74 65 2c 20 69 67 6e 6f 72 65 64 0a 00 00 00 |ete, ignored....|
00000170 3c 33 3e 55 6e 6b 6e 6f 77 6e 20 62 6f 6f 74 20 |<3>Unknown boot |
00000180 6f 70 74 69 6f 6e 20 60 25 73 27 3a 20 69 67 6e |option `%s': ign|
00000190 6f 72 69 6e 67 0a 00 00 54 6f 6f 20 6d 61 6e 79 |oring...Too many|
000001a0 20 62 6f 6f 74 20 65 6e 76 20 76 61 72 73 20 61 | boot env vars a|
000001b0 74 20 60 25 73 27 00 00 54 6f 6f 20 6d 61 6e 79 |t `%s'..Too many|
000001c0 20 62 6f 6f 74 20 69 6e 69 74 20 76 61 72 73 20 | boot init vars |
000001d0 61 74 20 60 25 73 27 00 65 61 72 6c 79 20 6f 70 |at `%s'.early op|
000001e0 74 69 6f 6e 73 00 00 00 3c 34 3e 4d 61 6c 66 6f |tions...<4>Malfo|
000001f0 72 6d 65 64 20 65 61 72 6c 79 20 6f 70 74 69 6f |rmed early optio|
00000200 6e 20 27 25 73 27 0a 00 3c 35 3e 00 3c 35 3e 4b |n '%s'..<5>.<5>K|
00000210 65 72 6e 65 6c 20 63 6f 6d 6d 61 6e 64 20 6c 69 |ernel command li|
00000220 6e 65 3a 20 25 73 0a 00 42 6f 6f 74 69 6e 67 20 |ne: %s..Booting |
00000230 6b 65 72 6e 65 6c 00 00 73 74 61 72 74 5f 6b 65 |kernel..start_ke|
00000240 72 6e 65 6c 28 29 3a 20 62 75 67 3a 20 69 6e 74 |rnel(): bug: int|
00000250 65 72 72 75 70 74 73 20 77 65 72 65 20 65 6e 61 |errupts were ena|
00000260 62 6c 65 64 20 65 61 72 6c 79 0a 00 3c 32 3e 69 |bled early..<2>i|
00000270 6e 69 74 72 64 20 6f 76 65 72 77 72 69 74 74 65 |nitrd overwritte|
00000280 6e 20 28 30 78 25 30 38 6c 78 20 3c 20 30 78 25 |n (0x%08lx < 0x%|
00000290 30 38 6c 78 29 20 2d 20 64 69 73 61 62 6c 69 6e |08lx) - disablin|
000002a0 67 20 69 74 2e 0a 00 00 48 4f 4d 45 3d 2f 00 00 |g it....HOME=/..|
000002b0 54 45 52 4d 3d 6c 69 6e 75 78 00 00 69 6e 69 74 |TERM=linux..init|
000002c0 00 00 00 00 2f 64 65 76 2f 72 6f 6f 74 00 00 00 |..../dev/root...|
000002d0 3c 35 3e 56 46 53 3a 20 49 6e 73 65 72 74 20 25 |<5>VFS: Insert %|
000002e0 73 20 61 6e 64 20 70 72 65 73 73 20 45 4e 54 45 |s and press ENTE|
000002f0 52 0a 00 00 20 72 65 61 64 6f 6e 6c 79 00 00 00 |R... readonly...|
00000300 56 46 53 3a 20 4d 6f 75 6e 74 65 64 20 72 6f 6f |VFS: Mounted roo|
00000310 74 20 28 25 73 20 66 69 6c 65 73 79 73 74 65 6d |t (%s filesystem|
00000320 29 25 73 2e 0a 00 00 00 56 46 53 3a 20 43 61 6e |)%s.....VFS: Can|
00000330 6e 6f 74 20 6f 70 65 6e 20 72 6f 6f 74 20 64 65 |not open root de|
00000340 76 69 63 65 20 22 25 73 22 20 6f 72 20 25 73 0a |vice "%s" or %s.|
00000350 00 00 00 00 50 6c 65 61 73 65 20 61 70 70 65 6e |....Please appen|
00000360 64 20 61 20 63 6f 72 72 65 63 74 20 22 72 6f 6f |d a correct "roo|
00000370 74 3d 22 20 62 6f 6f 74 20 6f 70 74 69 6f 6e 0a |t=" boot option.|
00000380 00 00 00 00 56 46 53 3a 20 55 6e 61 62 6c 65 20 |....VFS: Unable |
00000390 74 6f 20 6d 6f 75 6e 74 20 72 6f 6f 74 20 66 73 |to mount root fs|
000003a0 20 6f 6e 20 25 73 00 00 4e 6f 20 66 69 6c 65 73 | on %s..No files|
000003b0 79 73 74 65 6d 20 63 6f 75 6c 64 20 6d 6f 75 6e |ystem could moun|
000003c0 74 20 72 6f 6f 74 2c 20 74 72 69 65 64 3a 20 00 |t root, tried: .|
000003d0 2f 73 79 73 2f 62 6c 6f 63 6b 2f 25 73 2f 64 65 |/sys/block/%s/de|
000003e0 76 00 00 00 25 75 3a 25 75 00 00 00 2f 73 79 73 |v...%u:%u.../sys|
000003f0 2f 62 6c 6f 63 6b 2f 25 73 2f 72 61 6e 67 65 00 |/block/%s/range.|
00000400 2f 73 79 73 00 00 00 00 73 79 73 66 73 00 00 00 |/sys....sysfs...|
00000410 2f 64 65 76 2f 00 00 00 6e 66 73 00 3c 36 3e 57 |/dev/...nfs.<6>W|
00000420 61 69 74 69 6e 67 20 25 64 73 65 63 20 62 65 66 |aiting %dsec bef|
00000430 6f 72 65 20 6d 6f 75 6e 74 69 6e 67 20 72 6f 6f |ore mounting roo|
00000440 74 20 64 65 76 69 63 65 2e 2e 2e 0a 00 00 00 00 |t device........|
00000450 6d 74 64 00 3c 33 3e 25 73 0a 00 00 52 41 4d 44 |mtd.<3>%s...RAMD|
00000460 49 53 4b 3a 20 72 61 6e 20 6f 75 74 20 6f 66 20 |ISK: ran out of |
00000470 63 6f 6d 70 72 65 73 73 65 64 20 64 61 74 61 00 |compressed data.|
00000480 3c 33 3e 52 41 4d 44 49 53 4b 3a 20 69 6e 63 6f |<3>RAMDISK: inco|
00000490 6d 70 6c 65 74 65 20 77 72 69 74 65 20 28 25 64 |mplete write (%d|
000004a0 20 21 3d 20 25 64 29 20 25 6c 64 0a 00 00 00 00 | != %d) %ld.....|
000004b0 69 6e 63 6f 6d 70 6c 65 74 65 20 6c 69 74 65 72 |incomplete liter|
000004c0 61 6c 20 74 72 65 65 00 69 6e 63 6f 6d 70 6c 65 |al tree.incomple|
000004d0 74 65 20 64 69 73 74 61 6e 63 65 20 74 72 65 65 |te distance tree|
000004e0 00 00 00 00 2f 64 65 76 2f 72 61 6d 00 00 00 00 |..../dev/ram....|
000004f0 3c 35 3e 52 41 4d 44 49 53 4b 3a 20 43 6f 6d 70 |<5>RAMDISK: Comp|
00000500 72 65 73 73 65 64 20 69 6d 61 67 65 20 66 6f 75 |ressed image fou|
00000510 6e 64 20 61 74 20 62 6c 6f 63 6b 20 25 64 0a 00 |nd at block %d..|
00000520 3c 35 3e 52 41 4d 44 49 53 4b 3a 20 72 6f 6d 66 |<5>RAMDISK: romf|
00000530 73 20 66 69 6c 65 73 79 73 74 65 6d 20 66 6f 75 |s filesystem fou|
00000540 6e 64 20 61 74 20 62 6c 6f 63 6b 20 25 64 0a 00 |nd at block %d..|
00000550 3c 35 3e 52 41 4d 44 49 53 4b 3a 20 63 72 61 6d |<5>RAMDISK: cram|
00000560 66 73 20 66 69 6c 65 73 79 73 74 65 6d 20 66 6f |fs filesystem fo|
00000570 75 6e 64 20 61 74 20 62 6c 6f 63 6b 20 25 64 0a |und at block %d.|
00000580 00 00 00 00 3c 35 3e 52 41 4d 44 49 53 4b 3a 20 |....<5>RAMDISK: |
00000590 73 71 75 61 73 68 66 73 20 66 69 6c 65 73 79 73 |squashfs filesys|
000005a0 74 65 6d 20 66 6f 75 6e 64 20 61 74 20 62 6c 6f |tem found at blo|
000005b0 63 6b 20 25 64 0a 00 00 3c 35 3e 52 41 4d 44 49 |ck %d...<5>RAMDI|
000005c0 53 4b 3a 20 4d 69 6e 69 78 20 66 69 6c 65 73 79 |SK: Minix filesy|
000005d0 73 74 65 6d 20 66 6f 75 6e 64 20 61 74 20 62 6c |stem found at bl|
000005e0 6f 63 6b 20 25 64 0a 00 3c 35 3e 52 41 4d 44 49 |ock %d..<5>RAMDI|
000005f0 53 4b 3a 20 65 78 74 32 20 66 69 6c 65 73 79 73 |SK: ext2 filesys|
00000600 74 65 6d 20 66 6f 75 6e 64 20 61 74 20 62 6c 6f |tem found at blo|
00000610 63 6b 20 25 64 0a 00 00 3c 35 3e 52 41 4d 44 49 |ck %d...<5>RAMDI|
00000620 53 4b 3a 20 43 6f 75 6c 64 6e 27 74 20 66 69 6e |SK: Couldn't fin|
00000630 64 20 76 61 6c 69 64 20 52 41 4d 20 64 69 73 6b |d valid RAM disk|
00000640 20 69 6d 61 67 65 20 73 74 61 72 74 69 6e 67 20 | image starting |
00000650 61 74 20 25 64 2e 0a 00 3c 33 3e 52 41 4d 44 49 |at %d...<3>RAMDI|
00000660 53 4b 3a 20 43 6f 75 6c 64 6e 27 74 20 61 6c 6c |SK: Couldn't all|
00000670 6f 63 61 74 65 20 67 7a 69 70 20 62 75 66 66 65 |ocate gzip buffe|
00000680 72 0a 00 00 3c 33 3e 52 41 4d 44 49 53 4b 3a 20 |r...<3>RAMDISK: |
00000690 43 6f 75 6c 64 6e 27 74 20 61 6c 6c 6f 63 61 74 |Couldn't allocat|
000006a0 65 20 67 7a 69 70 20 77 69 6e 64 6f 77 0a 00 00 |e gzip window...|
000006b0 62 61 64 20 67 7a 69 70 20 6d 61 67 69 63 20 6e |bad gzip magic n|
000006c0 75 6d 62 65 72 73 00 00 69 6e 74 65 72 6e 61 6c |umbers..internal|
000006d0 20 65 72 72 6f 72 2c 20 69 6e 76 61 6c 69 64 20 | error, invalid |
000006e0 6d 65 74 68 6f 64 00 00 49 6e 70 75 74 20 69 73 |method..Input is|
000006f0 20 65 6e 63 72 79 70 74 65 64 00 00 4d 75 6c 74 | encrypted..Mult|
00000700 69 20 70 61 72 74 20 69 6e 70 75 74 00 00 00 00 |i part input....|
00000710 49 6e 70 75 74 20 68 61 73 20 69 6e 76 61 6c 69 |Input has invali|
00000720 64 20 66 6c 61 67 73 00 69 6e 76 61 6c 69 64 20 |d flags.invalid |
00000730 63 6f 6d 70 72 65 73 73 65 64 20 66 6f 72 6d 61 |compressed forma|
00000740 74 20 28 65 72 72 3d 31 29 00 00 00 69 6e 76 61 |t (err=1)...inva|
00000750 6c 69 64 20 63 6f 6d 70 72 65 73 73 65 64 20 66 |lid compressed f|
00000760 6f 72 6d 61 74 20 28 65 72 72 3d 32 29 00 00 00 |ormat (err=2)...|
00000770 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 00 00 00 |out of memory...|
00000780 6f 75 74 20 6f 66 20 69 6e 70 75 74 20 64 61 74 |out of input dat|
00000790 61 00 00 00 69 6e 76 61 6c 69 64 20 63 6f 6d 70 |a...invalid comp|
000007a0 72 65 73 73 65 64 20 66 6f 72 6d 61 74 20 28 6f |ressed format (o|
000007b0 74 68 65 72 29 00 00 00 63 72 63 20 65 72 72 6f |ther)...crc erro|
000007c0 72 00 00 00 6c 65 6e 67 74 68 20 65 72 72 6f 72 |r...length error|
000007d0 00 00 00 00 52 41 4d 44 49 53 4b 3a 20 69 6d 61 |....RAMDISK: ima|
000007e0 67 65 20 74 6f 6f 20 62 69 67 21 20 28 25 64 4b |ge too big! (%dK|
000007f0 69 42 2f 25 6c 64 4b 69 42 29 0a 00 2f 69 6e 69 |iB/%ldKiB)../ini|
00000800 ff ff ff ff ff ff ff ff 1b 47 01 e3 00 00 39 1e |.........G....9.|
00000810 ff ff ff ff ff ff ff ff fa 08 11 e9 00 30 23 06 |.............0#.|
00000820 ff ff ff ff ff ff ff ff 8f 6d ce 82 01 20 64 74 |.........m... dt|
00000830 ff ff ff ff ff ff ff ff a3 be 30 85 01 e0 9e 8a |..........0.....|
--- End code ---
according pdf - internal ECC - its 8 bytes from 516 bytes (512 of data and 4 spare(in my case always 0xFFFFFFFF))
Earlier, on other devices, I came across the fact that after reading data and writing it to another device,
this new device didn't work. them due to uncorrected ECC data.
so, when I need write 0x800 to new flash, I need read 0x840 from old flash, and check ECC.
that's why I'm always check ECC in the read data. but i can't do this here ((
Navigation
[0] Message Index
Go to full version