Blame view

doc/README.davinci.nand_spl 5.03 KB
d41ce506b   Eric Lee   Initial Release, ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
  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 ...