GRUB on DOC: 2Mb issues
Ciro Cattuto
ciro at prosa.it
Mon Aug 28 12:50:18 EDT 2000
David,
since the only DiskOnChip I have is a 2 Mb one, I had to solve some issues
with makecsum.c and doc_stage1.S before being able to load/run GRUB as a
replacement firmware. The ROM IPL of the 2Mb DOC (or any DOC with page256==1,
I guess) loads the first 0x2000 bytes sequentially instead of loading half
of the first 0x4000 bytes, as you describe in mtd/grub/README. This requires
some modifications to makecsum.c in order to build a valid firmware image.
Also, doc_stage1.S doesn't support the addressing scheme needed for 2Mb DOCs,
so I had to make a few modifications to make it load GRUB-stage2.
The relevant cvs diffs follow. Notice: these mods make doc_stage1.S and
makecsum.c work _only_ for 2Mb DOCs! I'd like to merge this functionality
into the existing code, but I'll wait for your feedback. I'd use a simple
"#ifdef DOC_PAGE256" both in doc_stage1.S and makecsum.c, but in the long
run it would be nice to be able to access the page256 flag (mtd->priv->page256)
from userland (page256 in mtd_info_user?).
Cheers,
Ciro
Index: doc_stage1.S
===================================================================
RCS file: /home/cvs/mtd/grub/doc_stage1.S,v
retrieving revision 1.8
diff -r1.8 doc_stage1.S
166c166
< /* Send new READ command - is it READ0 or READ1? */
---
> /* Send new READ0 command */
169c169
< andb $1,%ah
---
> xorb %ah,%ah
176,177c176
< /* We sent bits 0-7, then 9-16, then 17-23 */
< /* Yes bit 8 is missing. Read the NAND flash specs */
---
> /* We sent bits 0-7, then 8-15, then 16-23 */
182,186c181
< /* Bits 9-16 */
< shrw $1,%dx
< .byte 0x80, 0xce /* orb adrbit16, %dh */
< adrbit16:
< .byte 0
---
> /* Bits 8-15 */
189c184
< /* Bits 17-23 are also zero */
---
> /* Bits 16-23 */
216,217d210
< addb $0x80, %cs:adrbit16 /* Increase bit 16 */
< jnc endloop /* Did it overflow? */
Index: makecsum.c
===================================================================
RCS file: /home/cvs/mtd/grub/makecsum.c,v
retrieving revision 1.1
diff -r1.1 makecsum.c
5c5
< unsigned char buf[16384];
---
> unsigned char buf[8192];
12c12
< memset(buf, 0xff, 16384);
---
> memset(buf, 0xff, 8192);
61c61
< len = read(st2fd, buf+512, 16384-512);
---
> len = read(st2fd, buf+512, 8192-512);
73,74c73
< i=0;
< while (i<16384) {
---
> for (i=0 ; i<8192 ; i++)
76,79d74
< i++;
< if ((i >> 8)&1)
< i += 256;
< }
85c80
< len = write(outfd, buf, 16384);
---
> len = write(outfd, buf, 8192);
94,95c89,90
< if (len < 16384) {
< fprintf(stderr, "short write of output file (%d bytes < 16384)\n",
---
> if (len < 8192) {
> fprintf(stderr, "short write of output file (%d bytes < 8192)\n",
105c100
< len = read(st2fd, buf, 16384);
---
> len = read(st2fd, buf, 8192);
--
Ciro Cattuto, Open Source Developer, Linuxcare Italia SpA
Tel. +39.338.3002140 Fax +39.049.8036484
ciro at linuxcare.com http://www.linuxcare.com/
ciro at prosa.it http://www.prosa.it/
Linuxcare. Support for the revolution.
To unsubscribe, send "unsubscribe mtd" to majordomo at infradead.org
More information about the linux-mtd
mailing list