[U-Boot-Users] OneNAND alternative to X-Load

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) __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. Oh yeah, I'm using arm-linux-gcc 3.4.4.

Hi Pete,
On Wednesday 23 May 2007, Pete MacKay wrote:
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
Did you take a look at the currently implemented NAND booting support in U-Boot? Right now the PPC440EPx Sequoia board is the only board in this NAND_SPL infrastructure. Please take a look at doc/README.nand-boot-ppc440 for some more details. And the sequoia board config file too of course.
Your approach is a little different. It would be best, if you could at least try to match the infrastructure of nand_spl a little better. For example the nand_spl/board/xxx directory with the upon compiletime created links to the common files.
Please let me know, if you feel that your OneNAND booting support for your board can be implemented in this infrastructure.
Thanks.
Best regards, Stefan
===================================================================== DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: +49-8142-66989-0 Fax: +49-8142-66989-80 Email: office@denx.de =====================================================================
participants (2)
-
Pete MacKay
-
Stefan Roese