OneNAND alternative to X-Load

Kyungmin Park kmpark at infradead.org
Tue May 29 21:27:42 EDT 2007


Hi Pete Mackay,

Before the main story, I explain the history of x-loader.
First, it was designed for NAND boot from TI for their platforms. With simple
code and similar structure of U-Boot, it's easy to modify for OneNAND.
And at that time, we also considered another bootloader, of course, including
U-Boot. So we released the X-loader for OneNAND as 1st bootloader.

Now you want to add the 1KB bootloader (1st bootloader) for OneNAND at U-Boot. I
think there's no problem except the handling of code position at OneNAND.

The original handling of xloader is like this
1. The xloader (less than 1KB) loads u-boot image to DRAM using BufferRAM0.
2. Jump to DRAM address
3. run u-boot at DRAM

0x0000 (BootRAM0) __xloader_start                   --> load u-boot code to
BufferRAM0
0x03fff                     __xloader_end
0x0400 (not valid)
0x0800 (BufferRAM0) used for xloader buffer ram --> u-boot code
0x0bff                
0x0c00 (BufferRAM1) not used                           --> used for u-boot
buffer ram
0x0fff

But as you mentioned, you can make a u-boot.bin image with linker script
handling. Overall structures are similar except that it's built with one time.

Also you can find the similar idea at
http://linuxdevices.com/articles/AT2779754250.html

And please see the below comment.

Thank you,
Kyungmin Park

> 
> We're developing a PXA-270-based machine that will boot from 
> OneNAND.  I
> wanted to share my ideas (and code) with anyone faced with 
> this challenge,
> since this forum (esp. Kyungmin Park - thank you!!) was quite helpful.
>  I'll start off explaining my u-boot code, then when I get 
> some time I'll
> submit my PXA-270 platform driver as a patch (currently works 
> on 2.6.18).
> 
> We use a common approach: in lacking JTAG we have chip select 
> jumpers that
> swap CS0/CS1 between NOR and OneNAND.  The OneNAND has a 
> bottom-mapped 2K
> boot buffer of which 1K is valid, which is where the level 1 
> boot loader
> fits.  It uses two memory-mapped 'bufferrams' to ping-pong 
> data out of the
> NAND pages, but you want to use BUFFERRAM1 only as writing 
> BUFFERRAM0 can
> corrupt BOOTRAM0 on some revs of the chip.  (We're executing out of
> BOOTRAM0 so that's bad :).
> 
> There is open-source code called "x-loader" that is a 
> stripped-down u-boot
> for the level 1 boot loader.  What I did was integrate the level 1
> function into u-boot itself with a custom configuration and 
> linker script.
> In the top u-boot Makefile I added this:
> 
> myboard_config	:	unconfig
> 	@./mkconfig $(@:_config=) arm pxa myboard
> 
> myboard_onenand_config	:	unconfig
> 	@./mkconfig $(@:_config=) arm pxa myboard
> 	@echo "LDSCRIPT := 
> $(TOPDIR)/board/myboard/u-boot.onenand.lds" >>
> include/config.mk
> 
> In include/configs/myboard_onenand.h I simply define 
> CONFIG_BOOT_ONENAND
> and then include myboard.h, with conditional switches inside for base
> address, etc (i.e. define CONFIG_IDENT_STRING as " from 
> OneNAND" or " from
> NOR").
> 
> The linker script replaces cpu/pxa/start.S with oneboot.S and 
> makes sure
> the C code to load the other pages positions there too.  Then 
> it aligns
> the rest of u-boot at the 2K boundary (NAND page 1).  The 
> oneboot.S code
> melds start.S with lowlevel_init but calls C code to read the 
> rest of the
> block 0 pages into RAM.  I later optimized it to replace 
> start.S entirely
> for the NOR version.
> 
> BTW, I lacked originality and stole (liked) the name: oneboot 
> is not to be
> confused with the script that merges x-load and u-boot into one binary
> image.
> 
> This is the relevant portion of the u-boot linker script:
> 
> 	. = 0x00000000;
> 
> 	. = ALIGN(4);
> 	.text :
> 	{
> 	  board/myboard/oneboot.o	(.text)
> 	  board/myboard/onenand_boot.o	(.text)

The onenand_boot.c is common code for all platforms. I think it's located in
drivers/onenand or onenand_spl as nand_spl in U-Boot.
Yes I know the OneNAND patch for U-Boot is not merged yet. In this code,
however, there's no problem to boot with OneNAND.

> 	  __oneboot_end = .;	/* must not exceed 0x400! */
> 
> 	  . = 0x800;		/* reposition to 2K page boundary */
> 	  __page1_start = .;	/* OneNAND loading starts here */
> 	  *				(.text)
> 	}
> 
> Look at System.map to make sure your level 1 code fits within 
> 1K.  Also in
> oneboot.S I commented out labels and used relative branches 
> to save symbol
> space and replaced ldr with mov wherever possible.  And with the 270
> optimizations in oneboot.S our system screams!
> 
> The full code is at http://code.architechnical.net/onenand, 
> including the
> 2.6.18 pxa27x OneNAND driver.  Please don't laugh at my lame 
> ancient web
> site.
> 
> 
> 
> ______________________________________________________
> Linux MTD discussion mailing list
> http://lists.infradead.org/mailman/listinfo/linux-mtd/
> 
> 





More information about the linux-mtd mailing list