| With this approach, we don't need the UBL any more on DaVinci boards. | 
 | A "make boardname" will compile a u-boot.ubl, with UBL Header, which is | 
 | needed for the RBL to find the "UBL", which actually is a  UBL-compatible | 
 | header, nand spl code and u-boot code. | 
 |  | 
 |  | 
 | As the RBL uses another read function as the "standard" u-boot, | 
 | we need a command, which switches between this two read/write | 
 | functions, so we can write the UBL header and the spl | 
 | code in a format, which the RBL can read. This is realize | 
 | (at the moment in board specific code) in the u-boot command | 
 | nandrbl | 
 |  | 
 | nandrbl without arguments returns actual mode (rbl or uboot). | 
 | with nandrbl mode (mode = "rbl" or "uboot") you can switch | 
 | between the two NAND read/write modes. | 
 |  | 
 |  | 
 | To set up mkimage you need a config file for mkimage, example: | 
 | board/ait/cam_enc_4xx/ublimage.cfg | 
 |  | 
 | For information about the configuration please see: | 
 | doc/README.ublimage | 
 |  | 
 | Example for the cam_enc_4xx board: | 
 | On the cam_enc_4xx board we have a NAND flash with blocksize = 0x20000 and | 
 | pagesize = 0x800, so the u-boot.ubl image (which you get with: | 
 | "make cam_enc_4xx") looks like this: | 
 |  | 
 | 00000000  00 ed ac a1 20 00 00 00  06 00 00 00 05 00 00 00  |.... ...........| | 
 | 00000010  00 00 00 00 20 00 00 00  ff ff ff ff ff ff ff ff  |.... ...........| | 
 | 00000020  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................| | 
 | * | 
 | 00000800  14 00 00 ea 14 f0 9f e5  10 f0 9f e5 0c f0 9f e5  |................| | 
 | 00000810  08 f0 9f e5 04 f0 9f e5  00 f0 9f e5 04 f0 1f e5  |................| | 
 | 00000820  00 01 00 00 78 56 34 12  78 56 34 12 78 56 34 12  |....xV4.xV4.xV4.| | 
 | [...] | 
 | * | 
 | 00001fe0  00 00 00 00 00 00 00 00  ff ff ff ff ff ff ff ff  |................| | 
 | 00001ff0  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................| | 
 | * | 
 | 00003800  14 00 00 ea 14 f0 9f e5  14 f0 9f e5 14 f0 9f e5  |................| | 
 | 00003810  14 f0 9f e5 14 f0 9f e5  14 f0 9f e5 14 f0 9f e5  |................| | 
 | 00003820  80 01 08 81 e0 01 08 81  40 02 08 81 a0 02 08 81  |........@.......| | 
 |  | 
 | In the first "page" of the image, we have the UBL Header, needed for | 
 | the RBL to find the spl code. | 
 |  | 
 | The spl code starts in the second "page" of the image, with a size | 
 | defined by: | 
 |  | 
 | #define CONFIG_SYS_NROF_PAGES_NAND_SPL	6 | 
 |  | 
 | After the spl code, there comes the "real" u-boot code | 
 | @ (6 + 1) * pagesize = 0x3800 | 
 |  | 
 | ------------------------------------------------------------------------ | 
 | Setting up spl code: | 
 |  | 
 | /* | 
 |  * RBL searches from Block n (n = 1..24) | 
 |  * so we can define, how many UBL Headers | 
 |  * we write before the real spl code | 
 |  */ | 
 | #define CONFIG_SYS_NROF_UBL_HEADER	5 | 
 | #define CONFIG_SYS_NROF_PAGES_NAND_SPL	6 | 
 |  | 
 | #define CONFIG_SYS_NAND_U_BOOT_OFFS	((CONFIG_SYS_NROF_UBL_HEADER * \ | 
 | 					CONFIG_SYS_NAND_BLOCK_SIZE) + \ | 
 | 					(CONFIG_SYS_NROF_PAGES_NAND_SPL) * \ | 
 | 					CONFIG_SYS_NAND_PAGE_SIZE) | 
 | ------------------------------------------------------------------------ | 
 |  | 
 | Burning into NAND: | 
 |  | 
 | step 1: | 
 | The RBL searches from Block n ( n = 1..24) on page 0 for valid UBL | 
 | Headers, so you have to burn the UBL header page from the u-boot.ubl | 
 | image to the blocks, you want to have the UBL header. | 
 | !! Don;t forget to switch to rbl nand read/write functions with | 
 |    "nandrbl rbl" | 
 |  | 
 | step 2: | 
 | You need to setup in the ublimage.cfg, where the RBL can find the spl | 
 | code, and how big it is. | 
 |  | 
 | !! RBL always starts reading from page 0 !! | 
 |  | 
 | For the AIT board, we have: | 
 | PAGES		6 | 
 | START_BLOCK	5 | 
 |  | 
 | So we need to copy the spl code to block 5 page 0 | 
 | !! Don;t forget to switch to rbl nand read/write functions with | 
 |    "nandrbl rbl" | 
 |  | 
 | step 3: | 
 | You need to copy the u-boot image to the block/page | 
 | where the spl code reads it (CONFIG_SYS_NAND_U_BOOT_OFFS) | 
 | !! Don;t forget to switch to rbl nand read/write functions with | 
 |    "nandrbl uboot", which is default. | 
 |  | 
 | On the cam_enc_4xx board it is: | 
 | #define CONFIG_SYS_NAND_U_BOOT_OFFS	(0xc0000) | 
 |  | 
 | -> this results in following NAND usage on the cam_enc_4xx board: | 
 |  | 
 | addr | 
 |  | 
 | 20000		possible UBL Header | 
 | 40000		possible UBL Header | 
 | 60000		possible UBL Header | 
 | 80000		possilbe UBL Header | 
 | a0000		spl code | 
 | c0000		u-boot code | 
 |  | 
 | The above steps are executeed through the following environment vars: | 
 | (using 80000 as address for the UBL header) | 
 |  | 
 | pagesz=800 | 
 | uboot=/tftpboot/cam_enc_4xx/u-boot.ubl | 
 | load=tftp 80000000 ${uboot} | 
 | writeheader nandrbl rbl;nand erase 80000 ${pagesz};nand write 80000000 80000 ${pagesz};nandrbl uboot | 
 | writenand_spl nandrbl rbl;nand erase a0000 3000;nand write 80000800 a0000 3000;nandrbl uboot | 
 | writeuboot nandrbl uboot;nand erase c0000 5d000;nand write 80003800 c0000 5d000 | 
 | update=run load writeheader writenand_spl writeuboot | 
 |  | 
 | If you do a "run load update" u-boot, spl + ubl header | 
 | are magically updated ;-) | 
 |  | 
 | Note: | 
 | - There seem to be a bug in the RBL code (at least on my HW), | 
 |   In the UBL block, I can set the page to values != 0, so it | 
 |   is possible to burn step 1 and step 2 in one step into the | 
 |   flash, but the RBL ignores the page settings, so I have to | 
 |   burn the UBL Header to a page 0 and the spl code to | 
 |   a page 0 ... :-( | 
 | - If we make the nand read/write functions in the RBL equal to | 
 |   the functions in u-boot (as I have no RBL code, it is only | 
 |   possible in u-boot), we could burn the complete image in | 
 |   one step ... that would be nice ... |