After I looked into disassembled ARM codes, found no reason to cause problem.
When I compiled with -Os option, the C source code like following: static int flash_toggle (flash_info_t * info, flash_sect_t sect, uint offset, uchar cmd) { void *addr; cfiword_t cword; int retval; addr = flash_map (info, sect, offset); flash_make_cmd (info, cmd, &cword); switch (info->portwidth) { case FLASH_CFI_8BIT: retval = flash_read8(addr) != flash_read8(addr); break; case FLASH_CFI_16BIT: retval = flash_read16(addr) != flash_read16(addr); break; case FLASH_CFI_32BIT: retval = flash_read32(addr) != flash_read32(addr); break; case FLASH_CFI_64BIT: retval = flash_read64(addr) != flash_read64(addr); break; default: retval = 0; break; } flash_unmap(info, sect, offset, addr); return retval; } is compiled as following: f0497c: e1a0100a mov r1, sl f04980: e3a02000 mov r2, #0 ; 0x0 f04984: e1a00007 mov r0, r7 f04988: ebfffcbc bl f03c80 <flash_map> f0498c: e3a01040 mov r1, #64 ; 0x40 f04990: e1a04000 mov r4, r0 f04994: e28d2004 add r2, sp, #4 ; 0x4 f04998: e1a00007 mov r0, r7 f0499c: ebfffcbd bl f03c98 <flash_make_cmd> f049a0: e5d732af ldrb r3, [r7, #687] f049a4: e2433001 sub r3, r3, #1 ; 0x1 f049a8: e3530007 cmp r3, #7 ; 0x7 f049ac: 979ff103 ldrls pc, [pc, r3, lsl #2] f049b0: ea000022 b f04a40 <.text+0x4a40> f049b4: 00f049d4 ldreqsbt r4, [r0], #148 f049b8: 00f049e0 rsceqs r4, r0, r0, ror #19 f049bc: 00f04a40 rsceqs r4, r0, r0, asr #20 f049c0: 00f049ec rsceqs r4, r0, ip, ror #19 f049c4: 00f04a40 rsceqs r4, r0, r0, asr #20 f049c8: 00f04a40 rsceqs r4, r0, r0, asr #20 f049cc: 00f04a40 rsceqs r4, r0, r0, asr #20 f049d0: 00f04a00 rsceqs r4, r0, r0, lsl #20 f049d4: e5d42000 ldrb r2, [r4] f049d8: e5d43000 ldrb r3, [r4] f049dc: ea000004 b f049f4 <.text+0x49f4> f049e0: e1d420b0 ldrh r2, [r4] f049e4: e1d430b0 ldrh r3, [r4] f049e8: ea000001 b f049f4 <.text+0x49f4> f049ec: e5942000 ldr r2, [r4] f049f0: e5943000 ldr r3, [r4] f049f4: e0520003 subs r0, r2, r3 f049f8: 13a00001 movne r0, #1 ; 0x1 f049fc: ea00000d b f04a38 <.text+0x4a38> f04a00: e59f317c ldr r3, [pc, #380] ; f04b84 <.text+0x4b84> f04a04: e1a00004 mov r0, r4 f04a08: e1a0e00f mov lr, pc f04a0c: e1a0f003 mov pc, r3 f04a10: e59f216c ldr r2, [pc, #364] ; f04b84 <.text+0x4b84> f04a14: e1a05000 mov r5, r0 f04a18: e1a00004 mov r0, r4 f04a1c: e1a06001 mov r6, r1 f04a20: e1a0e00f mov lr, pc f04a24: e1a0f002 mov pc, r2 f04a28: e1550000 cmp r5, r0 f04a2c: 1affff98 bne f04894 <flash_full_status_check+0x28> f04a30: e1560001 cmp r6, r1 f04a34: ea000000 b f04a3c <.text+0x4a3c> f04a38: e3500000 cmp r0, #0 ; 0x0 f04a3c: 1affff94 bne f04894 <flash_full_status_check+0x28> f049d4 ~ f049f0 is accessing flash_read8/16/32 functions, and this code should be work because two sequential read from CFI flash changes toggle bit while erase/write is in action. But, two read operation gets the same result. Any other things that I wasn't understand ? TIA, Any advice will be appreciated. Best regards, Choe, Hyun-ho 2008-11-20 (목), 12:34 -0600, Andrew Dyer 쓰시길: > On Thu, Nov 20, 2008 at 11:59 AM, Choe, Hyun-ho <[EMAIL PROTECTED]> wrote: > > In cpu dir, there is arm920t/ks8695. > > ks8695p is some modified chip from ks8695. > > > > In board section, OpenGear cm4008 and cm41xx uses ks8695. > > > > > > I would guess the problem is that the compiler is reading the hardware > once and using that value both times, thinking that the location is > memory, not a hardware register, where the value may change from time > to time. > I've always fixed this with a 'volatile' pointer, which is supposed to > force the compiler to read the location every time it is accessed. > Supposedly the 'linux way' is to use special accessor functions that > are written to prevent this optimization from occurring. > > The other problem I've seen with toggle registers is reading them on > hardware that likes to do multiple reads to fill up a word of data. > For example you have a 16 bit flash on a 32-bit bus, and you read the > status register as a 32-bit quantity, then the hardware goes and reads > the register twice to fill up the 32-bit request, and the next time > you read you see the same data again as the first time through because > the value with the toggle in it is in the other half of the first > 32-bits you fetched. _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot