xref: /openbmc/u-boot/doc/README.davinci.nand_spl (revision 688d8f33f27ea596efb6632388ee60360996eed0)
1*4dd83490SHeiko SchocherWith this approach, we don't need the UBL any more on DaVinci boards.
2*4dd83490SHeiko SchocherA "make boardname" will compile a u-boot.ubl, with UBL Header, which is
3*4dd83490SHeiko Schocherneeded for the RBL to find the "UBL", which actually is a  UBL-compatible
4*4dd83490SHeiko Schocherheader, nand spl code and u-boot code.
5*4dd83490SHeiko Schocher
6*4dd83490SHeiko Schocher
7*4dd83490SHeiko SchocherAs the RBL uses another read function as the "standard" u-boot,
8*4dd83490SHeiko Schocherwe need a command, which switches between this two read/write
9*4dd83490SHeiko Schocherfunctions, so we can write the UBL header and the spl
10*4dd83490SHeiko Schochercode in a format, which the RBL can read. This is realize
11*4dd83490SHeiko Schocher(at the moment in board specific code) in the u-boot command
12*4dd83490SHeiko Schochernandrbl
13*4dd83490SHeiko Schocher
14*4dd83490SHeiko Schochernandrbl without arguments returns actual mode (rbl or uboot).
15*4dd83490SHeiko Schocherwith nandrbl mode (mode = "rbl" or "uboot") you can switch
16*4dd83490SHeiko Schocherbetween the two NAND read/write modes.
17*4dd83490SHeiko Schocher
18*4dd83490SHeiko Schocher
19*4dd83490SHeiko SchocherTo set up mkimage you need a config file for mkimage, example:
20*4dd83490SHeiko Schocherboard/ait/cam_enc_4xx/ublimage.cfg
21*4dd83490SHeiko Schocher
22*4dd83490SHeiko SchocherFor information about the configuration please see:
23*4dd83490SHeiko Schocherdoc/README.ublimage
24*4dd83490SHeiko Schocher
25*4dd83490SHeiko SchocherExample for the cam_enc_4xx board:
26*4dd83490SHeiko SchocherOn the cam_enc_4xx board we have a NAND flash with blocksize = 0x20000 and
27*4dd83490SHeiko Schocherpagesize = 0x800, so the u-boot.ubl image (which you get with:
28*4dd83490SHeiko Schocher"make cam_enc_4xx") looks like this:
29*4dd83490SHeiko Schocher
30*4dd83490SHeiko Schocher00000000  00 ed ac a1 20 00 00 00  06 00 00 00 05 00 00 00  |.... ...........|
31*4dd83490SHeiko Schocher00000010  00 00 00 00 20 00 00 00  ff ff ff ff ff ff ff ff  |.... ...........|
32*4dd83490SHeiko Schocher00000020  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|
33*4dd83490SHeiko Schocher*
34*4dd83490SHeiko Schocher00000800  14 00 00 ea 14 f0 9f e5  10 f0 9f e5 0c f0 9f e5  |................|
35*4dd83490SHeiko Schocher00000810  08 f0 9f e5 04 f0 9f e5  00 f0 9f e5 04 f0 1f e5  |................|
36*4dd83490SHeiko Schocher00000820  00 01 00 00 78 56 34 12  78 56 34 12 78 56 34 12  |....xV4.xV4.xV4.|
37*4dd83490SHeiko Schocher[...]
38*4dd83490SHeiko Schocher*
39*4dd83490SHeiko Schocher00001fe0  00 00 00 00 00 00 00 00  ff ff ff ff ff ff ff ff  |................|
40*4dd83490SHeiko Schocher00001ff0  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|
41*4dd83490SHeiko Schocher*
42*4dd83490SHeiko Schocher00003800  14 00 00 ea 14 f0 9f e5  14 f0 9f e5 14 f0 9f e5  |................|
43*4dd83490SHeiko Schocher00003810  14 f0 9f e5 14 f0 9f e5  14 f0 9f e5 14 f0 9f e5  |................|
44*4dd83490SHeiko Schocher00003820  80 01 08 81 e0 01 08 81  40 02 08 81 a0 02 08 81  |........@.......|
45*4dd83490SHeiko Schocher
46*4dd83490SHeiko SchocherIn the first "page" of the image, we have the UBL Header, needed for
47*4dd83490SHeiko Schocherthe RBL to find the spl code.
48*4dd83490SHeiko Schocher
49*4dd83490SHeiko SchocherThe spl code starts in the second "page" of the image, with a size
50*4dd83490SHeiko Schocherdefined by:
51*4dd83490SHeiko Schocher
52*4dd83490SHeiko Schocher#define CONFIG_SYS_NROF_PAGES_NAND_SPL	6
53*4dd83490SHeiko Schocher
54*4dd83490SHeiko SchocherAfter the spl code, there comes the "real" u-boot code
55*4dd83490SHeiko Schocher@ (6 + 1) * pagesize = 0x3800
56*4dd83490SHeiko Schocher
57*4dd83490SHeiko Schocher------------------------------------------------------------------------
58*4dd83490SHeiko SchocherSetting up spl code:
59*4dd83490SHeiko Schocher
60*4dd83490SHeiko Schocher/*
61*4dd83490SHeiko Schocher * RBL searches from Block n (n = 1..24)
62*4dd83490SHeiko Schocher * so we can define, how many UBL Headers
63*4dd83490SHeiko Schocher * we write before the real spl code
64*4dd83490SHeiko Schocher */
65*4dd83490SHeiko Schocher#define CONFIG_SYS_NROF_UBL_HEADER	5
66*4dd83490SHeiko Schocher#define CONFIG_SYS_NROF_PAGES_NAND_SPL	6
67*4dd83490SHeiko Schocher
68*4dd83490SHeiko Schocher#define CONFIG_SYS_NAND_U_BOOT_OFFS	((CONFIG_SYS_NROF_UBL_HEADER * \
69*4dd83490SHeiko Schocher					CONFIG_SYS_NAND_BLOCK_SIZE) + \
70*4dd83490SHeiko Schocher					(CONFIG_SYS_NROF_PAGES_NAND_SPL) * \
71*4dd83490SHeiko Schocher					CONFIG_SYS_NAND_PAGE_SIZE)
72*4dd83490SHeiko Schocher------------------------------------------------------------------------
73*4dd83490SHeiko Schocher
74*4dd83490SHeiko SchocherBurning into NAND:
75*4dd83490SHeiko Schocher
76*4dd83490SHeiko Schocherstep 1:
77*4dd83490SHeiko SchocherThe RBL searches from Block n ( n = 1..24) on page 0 for valid UBL
78*4dd83490SHeiko SchocherHeaders, so you have to burn the UBL header page from the u-boot.ubl
79*4dd83490SHeiko Schocherimage to the blocks, you want to have the UBL header.
80*4dd83490SHeiko Schocher!! Don;t forget to switch to rbl nand read/write functions with
81*4dd83490SHeiko Schocher   "nandrbl rbl"
82*4dd83490SHeiko Schocher
83*4dd83490SHeiko Schocherstep 2:
84*4dd83490SHeiko SchocherYou need to setup in the ublimage.cfg, where the RBL can find the spl
85*4dd83490SHeiko Schochercode, and how big it is.
86*4dd83490SHeiko Schocher
87*4dd83490SHeiko Schocher!! RBL always starts reading from page 0 !!
88*4dd83490SHeiko Schocher
89*4dd83490SHeiko SchocherFor the AIT board, we have:
90*4dd83490SHeiko SchocherPAGES		6
91*4dd83490SHeiko SchocherSTART_BLOCK	5
92*4dd83490SHeiko Schocher
93*4dd83490SHeiko SchocherSo we need to copy the spl code to block 5 page 0
94*4dd83490SHeiko Schocher!! Don;t forget to switch to rbl nand read/write functions with
95*4dd83490SHeiko Schocher   "nandrbl rbl"
96*4dd83490SHeiko Schocher
97*4dd83490SHeiko Schocherstep 3:
98*4dd83490SHeiko SchocherYou need to copy the u-boot image to the block/page
99*4dd83490SHeiko Schocherwhere the spl code reads it (CONFIG_SYS_NAND_U_BOOT_OFFS)
100*4dd83490SHeiko Schocher!! Don;t forget to switch to rbl nand read/write functions with
101*4dd83490SHeiko Schocher   "nandrbl uboot", which is default.
102*4dd83490SHeiko Schocher
103*4dd83490SHeiko SchocherOn the cam_enc_4xx board it is:
104*4dd83490SHeiko Schocher#define CONFIG_SYS_NAND_U_BOOT_OFFS	(0xc0000)
105*4dd83490SHeiko Schocher
106*4dd83490SHeiko Schocher-> this results in following NAND usage on the cam_enc_4xx board:
107*4dd83490SHeiko Schocher
108*4dd83490SHeiko Schocheraddr
109*4dd83490SHeiko Schocher
110*4dd83490SHeiko Schocher20000		possible UBL Header
111*4dd83490SHeiko Schocher40000		possible UBL Header
112*4dd83490SHeiko Schocher60000		possible UBL Header
113*4dd83490SHeiko Schocher80000		possilbe UBL Header
114*4dd83490SHeiko Schochera0000		spl code
115*4dd83490SHeiko Schocherc0000		u-boot code
116*4dd83490SHeiko Schocher
117*4dd83490SHeiko SchocherThe above steps are executeed through the following environment vars:
118*4dd83490SHeiko Schocher(using 80000 as address for the UBL header)
119*4dd83490SHeiko Schocher
120*4dd83490SHeiko Schocherpagesz=800
121*4dd83490SHeiko Schocheruboot=/tftpboot/cam_enc_4xx/u-boot.ubl
122*4dd83490SHeiko Schocherload=tftp 80000000 ${uboot}
123*4dd83490SHeiko Schocherwriteheader nandrbl rbl;nand erase 80000 ${pagesz};nand write 80000000 80000 ${pagesz};nandrbl uboot
124*4dd83490SHeiko Schocherwritenand_spl nandrbl rbl;nand erase a0000 3000;nand write 80000800 a0000 3000;nandrbl uboot
125*4dd83490SHeiko Schocherwriteuboot nandrbl uboot;nand erase c0000 5d000;nand write 80003800 c0000 5d000
126*4dd83490SHeiko Schocherupdate=run load writeheader writenand_spl writeuboot
127*4dd83490SHeiko Schocher
128*4dd83490SHeiko SchocherIf you do a "run load update" u-boot, spl + ubl header
129*4dd83490SHeiko Schocherare magically updated ;-)
130*4dd83490SHeiko Schocher
131*4dd83490SHeiko SchocherNote:
132*4dd83490SHeiko Schocher- There seem to be a bug in the RBL code (at least on my HW),
133*4dd83490SHeiko Schocher  In the UBL block, I can set the page to values != 0, so it
134*4dd83490SHeiko Schocher  is possible to burn step 1 and step 2 in one step into the
135*4dd83490SHeiko Schocher  flash, but the RBL ignores the page settings, so I have to
136*4dd83490SHeiko Schocher  burn the UBL Header to a page 0 and the spl code to
137*4dd83490SHeiko Schocher  a page 0 ... :-(
138*4dd83490SHeiko Schocher- If we make the nand read/write functions in the RBL equal to
139*4dd83490SHeiko Schocher  the functions in u-boot (as I have no RBL code, it is only
140*4dd83490SHeiko Schocher  possible in u-boot), we could burn the complete image in
141*4dd83490SHeiko Schocher  one step ... that would be nice ...
142