aboutsummaryrefslogtreecommitdiffstats
path: root/documentation/bsp-guide/bsp.xml
blob: 5ff80da773598700e250f3e3711d4031a977a3f0 (plain)
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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">

<chapter id='bsp'>

        <title>Board Support Packages (BSP) - Developers Guide</title>

        <para>
            A Board Support Package (BSP) is a collection of information that
            defines how to support a particular hardware device, set of devices, or 
            hardware platform. 
            The BSP includes information about the hardware features 
            present on the device and kernel configuration information along with any 
            additional hardware drivers required.
            The BSP also lists any additional software 
            components required in addition to a generic Linux software stack for both 
            essential and optional platform features.
        </para>

        <para>
            This section (or document if you are reading the BSP Developer's Guide) defines
            a structure for these components
            so that BSPs follow a commonly understood layout.
            Providing a common form allows end-users to understand and become familiar 
            with the layout.  
            A common form also encourages standardization 
            of software support of hardware.
        </para>

        <para>
            The proposed format does have elements that are specific to the Poky and 
            OpenEmbedded build systems. 
            It is intended that this information can be 
            used by other systems besides Poky and OpenEmbedded and that it will be simple
            to extract information and convert it to other formats if required.
            Poky, through its standard layers mechanism, can directly accept the format 
            described as a layer.
            The BSP captures all 
            the hardware-specific details in one place in a standard format, which is 
            useful for any person wishing to use the hardware platform regardless of 
            the build system they are using.
        </para>

        <para>
            The BSP specification does not include a build system or other tools -
            it is concerned with the hardware-specific components only. 
            At the end 
            distribution point you can ship the BSP combined with a build system
            and other tools. 
            However, it is important to maintain the distinction that these
            are separate components that happen to be combined in certain end products.
        </para>

        <section id="bsp-filelayout">
            <title>Example Filesystem Layout</title>

            <para>
                The BSP consists of a file structure inside a base directory, which uses the following 
                naming convention:
                <literallayout class='monospaced'>
     meta-&lt;bsp_name&gt;
                </literallayout>
            </para>

            <para>
                "bsp_name" is a placeholder for the machine or platform name.
                Here are some example base directory names:
                <literallayout class='monospaced'>
     meta-emenlow
     meta-n450
     meta-beagleboard
                </literallayout>
            </para>

            <para>
                The base directory (<filename>meta-&lt;bsp_name&gt;</filename>) is the root of the BSP layer.
                This root is what you add to the BBLAYERS variable in <filename>build/conf/bblayers.conf</filename>
                so that the build system recognizes the BSP definition and from it can build an image.
                Here is an example:
                <literallayout class='monospaced'>
     BBLAYERS = " \
        /usr/local/src/yocto/meta \
        /usr/local/src/yocto/meta-yocto \
        /usr/local/src/yocto/meta-&lt;bsp_name&gt; \
        "
                </literallayout>
                For more detailed information on layers, see the 
                <ulink url='http://www.yoctoproject.org/docs/poky-ref-manual/poky-ref-manual.html#usingpoky-changes-layers'>
                BitBake Layers</ulink> section of the Poky Reference Manual.
            </para>

            <para>
                Below is the common form for the file structure inside a base directory.
                While you can use this basic form for the standard, realize that the actual structures
                for specific BSPs could differ. 

                <programlisting>
meta-&lt;bsp_name&gt;/                                
meta-&lt;bsp_name&gt;/&lt;bsp_license_file&gt;
meta-&lt;bsp_name&gt;/README
meta-&lt;bsp_name&gt;/binary/&lt;bootable_images&gt;
meta-&lt;bsp_name&gt;/conf/layer.conf 
meta-&lt;bsp_name&gt;/conf/machine/*.conf
meta-&lt;bsp_name&gt;/recipes-bsp/*
meta-&lt;bsp_name&gt;/recipes-graphics/*            
meta-&lt;bsp_name&gt;/recipes-kernel/linux/linux-yocto_git.bbappend
                </programlisting>
            </para>

            <para>
                Below is an example of the crownbay BSP:

                <programlisting>
meta-crownbay/COPYING.MIT
meta-crownbay/README
meta-crownbay/binary/.gitignore
meta-crownbay/conf/layer.conf
meta-crownbay/conf/machine/crownbay.conf
meta-crownbay/recipes-bsp/formfactor/formfactor/crownbay/machconfig
meta-crownbay/recipes-bsp/formfactor/formfactor_0.0.bbappend
meta-crownbay/recipes-graphics/xorg-xserver/xserver-xf86-config/crownbay/xcorg.conf
meta-crownbay/recipes-graphics/xorg-xserver/xserver-xf86-config_0.1.bbappend
meta-crownbay/recipes-graphics/xorg-xserver/xserver-xf86-emgd-bin/.gitignore
meta-crownbay/recipes-graphics/xorg-xserver/xserver-xf86-emgd-bin_1.7.99.2.bb
meta-crownbay/recipes-graphics/xorg-xserver/xserver-xf86-emgd/crosscompile.patch
meta-crownbay/recipes-graphics/xorg-xserver/xserver-xf86-emgd/fix_open_max_preprocessor_error.patch
meta-crownbay/recipes-graphics/xorg-xserver/xserver-xf86-emgd/macro_tweak.patch
meta-crownbay/recipes-graphics/xorg-xserver/xserver-xf86-emgd/nodolt.patch
meta-crownbay/recipes-graphics/xorg-xserver/xserver-xf86-emgd_1.7.99.2.bb
meta-crownbay/recipes-kernel/linux/linux-yocto_git.bbappend
                </programlisting>
            </para>

            <para>
                The following sections describe each part of the proposed BSP format.
            </para>

            <section id="bsp-filelayout-license">
            <title>License Files</title>
            <programlisting>
meta-&lt;bsp_name&gt;/&lt;bsp_license_file&gt;
            </programlisting>

            <para>
                These optional files satisfy licensing requirements for the BSP.
                The type or types of files here can vary depending on the licensing requirements.
                For example, in the crownbay BSP all licensing requirements are handled with the 
                <filename>COPYING.MIT</filename> file.  
            </para>

            <para>
                Licensing files can be MIT, BSD, GPLv*, and so forth.
                These files are recommended for the BSP but are optional and totally up to the BSP developer.
            </para>
            </section>

            <section id="bsp-filelayout-readme">
            <title>README File</title>
            <programlisting>
meta-&lt;bsp_name&gt;/README
            </programlisting>

            <para>
                This file provides information on how to boot the live images that are optionally 
                included in the <filename>/binary</filename> directory.
                The <filename>README</filename> file also provides special information needed for 
                building the image.
            </para>

            <para>
                Technically speaking a <filename>README</filename> is optional but it is highly 
                recommended that every BSP has one.
            </para>
            </section>

            <section id="bsp-filelayout-binary">
            <title>Pre-built User Binaries</title>
            <programlisting>
meta-&lt;bsp_name&gt;/binary/&lt;bootable_images&gt;
            </programlisting>

            <para>
                This optional area contains useful pre-built kernels and user-space filesystem 
                images appropriate to the target system.
                This directory typically contains graphical (e.g. sato) and minimal live images 
                when the BSP tarball has been created and made available in the Yocto Project website. 
                You can use these kernels and images to get a system running and quickly get started 
                on development tasks.
            </para>

            <para> 
                The exact types of binaries present are highly hardware-dependent.
                However, a README file should be present in the BSP file structure that explains how to use 
                the kernels and images with the target hardware. 
                If pre-built binaries are present, source code to meet licensing requirements must also 
                be provided in some form.
            </para>
            </section>

            <section id='bsp-filelayout-layer'>
            <title>Layer Configuration File</title>
            <programlisting>
meta-&lt;bsp_name&gt;/conf/layer.conf 
            </programlisting>

            <para>
                This file identifies the structure as a Poky layer, identifies the  
                contents of the layer, and contains information about how Poky should use it. 
                Generally, a standard boilerplate file such as the following works.
                In the following example you would replace "bsp" and "_bsp" with the actual name
                of the BSP (i.e. &lt;bsp_name&gt; from the example template).
            </para>

            <para>
               <programlisting>
# We have a conf directory, add to BBPATH
BBPATH := "${BBPATH}:${LAYERDIR}"

# We have a recipes directory containing .bb and .bbappend files, add to BBFILES
BBFILES := "${BBFILES} ${LAYERDIR}/recipes/*/*.bb \ 
            ${LAYERDIR}/recipes/*/*.bbappend"

BBFILE_COLLECTIONS += "bsp"
BBFILE_PATTERN_bsp := "^${LAYERDIR}/"
BBFILE_PRIORITY_bsp = "5"
                </programlisting>
            </para>

            <para>
                This file simply makes BitBake aware of the recipes and configuration directories.
                This file must exist so that Poky can recognize the BSP.
            </para>
            </section>

            <section id="bsp-filelayout-machine">
            <title>Hardware Configuration Options</title>
            <programlisting>
meta-&lt;bsp_name&gt;/conf/machine/*.conf
            </programlisting>

            <para>
                The machine files bind together all the information contained elsewhere
                in the BSP into a format that Poky can understand. 
                If the BSP supports multiple machines, multiple machine configuration files
                can be present. 
                These filenames correspond to the values to which users have set the MACHINE variable.
            </para>

            <para>
                These files define things such as the kernel package to use
                (PREFERRED_PROVIDER of virtual/kernel), the hardware drivers to
                include in different types of images, any special software components
                that are needed, any bootloader information, and also any special image
                format requirements.
            </para>

            <para>
                At least one machine file is required for a BSP layer.
                However, you can supply more than one file.
            </para>

            <para>
                This directory could also contain shared hardware "tuning" definitions that are commonly used to
                pass specific optimization flags to the compiler. 
                An example is <filename>tune-atom.inc</filename>:
            </para>
            <para>
                <programlisting>
BASE_PACKAGE_ARCH = "core2"
TARGET_CC_ARCH = "-m32 -march=core2 -msse3 -mtune=generic -mfpmath=sse"
                </programlisting>
            </para>
            <para>
                This example defines a new package architecture called "core2" and uses the
                specified optimization flags, which are carefully chosen to give best
                performance on atom processors.
            </para>
            <para>
                The tune file would be included by the machine definition and can be
                contained in the BSP or referenced from one of the standard core set of
                files included with Poky itself.
            </para>
            <para>
                Both the base package architecture file and the tune file are optional for a Poky BSP layer.
            </para>
            </section>

            <section id='bsp-filelayout-misc-recipes'>
            <title>Miscellaneous Recipe Files</title>
            <programlisting>
meta-&lt;bsp_name&gt;/recipes-bsp/*
            </programlisting>

            <para>
                This optional directory contains miscellaneous recipe files for the BSP.
                Most notably would be the formfactor files.
                For example, in the crownbay BSP there is a <filename>machconfig</filename> file and a
                <filename>formfactor_0.0.bbappend</filename> file:
                <programlisting>
meta-crownbay/recipes-bsp/formfactor/formfactor/crownbay/machconfig
meta-crownbay/recipes-bsp/formfactor/formfactor_0.0.bbappend
                </programlisting>
            </para>

            <note><para>
                If a BSP does not have a formfactor entry, defaults are established according to
                the configuration script.
            </para></note>
            </section>

            <section id='bsp-filelayout-recipes-graphics'>
            <title>Display Support Files</title>
            <programlisting>
meta-&lt;bsp_name&gt;/recipes-graphics/*            
            </programlisting>

            <para>
                This optional directory contains recipes for the BSP if it has 
                special requirements for graphics support.
                All files that are needed for the BSP to support a display are kept here. 
                For example, in the crownbay BSP several display support files exist:
                <programlisting>
meta-crownbay/recipes-graphics/xorg-xserver/xserver-xf86-config/crownbay/xcorg.conf
meta-crownbay/recipes-graphics/xorg-xserver/xserver-xf86-config_0.1.bbappend
meta-crownbay/recipes-graphics/xorg-xserver/xserver-xf86-emgd-bin/.gitignore
meta-crownbay/recipes-graphics/xorg-xserver/xserver-xf86-emgd-bin_1.7.99.2.bb
meta-crownbay/recipes-graphics/xorg-xserver/xserver-xf86-emgd/crosscompile.patch
meta-crownbay/recipes-graphics/xorg-xserver/xserver-xf86-emgd/fix_open_max_preprocessor_error.patch
meta-crownbay/recipes-graphics/xorg-xserver/xserver-xf86-emgd/macro_tweak.patch
meta-crownbay/recipes-graphics/xorg-xserver/xserver-xf86-emgd/nodolt.patch
meta-crownbay/recipes-graphics/xorg-xserver/xserver-xf86-emgd_1.7.99.2.bb
                </programlisting>
            </para>
            </section>

            <section id='bsp-filelayout-kernel'>
            <title>Linux Kernel Configuration</title>
            <programlisting>
meta-&lt;bsp_name&gt;/recipes-kernel/linux/linux-yocto_git.bbappend
            </programlisting>

            <para>
                This file appends your specific changes to the kernel you are using.
            </para>
            <para>
                For your BSP you typically want to use an existing Poky kernel found in the 
                Poky repository at <filename class='directory'>meta/recipes-kernel/kernel</filename>.
                You can append your specific changes to the kernel recipe by using an append file, 
                which is located in the 
                <filename class='directory'>meta-&lt;bsp_name&gt;/recipes-kernel/linux</filename> 
                directory.
            </para>
            <para>
                Suppose you use a BSP that uses the <filename>linux-yocto_git.bb</filename> kernel, 
                which is the preferred kernel to use for developing a new BSP using the Yocto Project.
                In other words, you have selected the kernel in your 
                <filename>&lt;bsp_name&gt;.conf</filename> file by adding the following statement:
                <programlisting>
PREFERRED_PROVIDER_virtual/kernel ?= "linux-yocto"
                </programlisting>
                You would use the <filename>linux-yocto_git.bbappend</filename> file to append 
                specific BSP settings to the kernel, thus configuring the kernel for your particular BSP.
            </para>
            <para>
                Now take a look at the existing "crownbay" BSP.
                The append file used is:
                <programlisting>
meta-crownbay/recipes-kernel/linux/linux-yocto_git.bbappend
                </programlisting>
                The file contains the following:
                <programlisting>
FILESEXTRAPATHS := "${THISDIR}/${PN}"
COMPATIBLE_MACHINE_crownbay = "crownbay"
KMACHINE_crownbay = "yocto/standard/crownbay"
                </programlisting>
                This append file adds "crownbay" as a compatible machine,
                and additionally sets a Yocto Kernel-specific variable that identifies the name of the 
                BSP branch to use in the GIT repository to find configuration information.
            </para>
            <para>
                One thing missing in this particular BSP, which you will typically need when 
                developing a BSP, is the kernel configuration (.config) for your BSP.
                When developing a BSP, you probably have a kernel configuration file or a set of kernel
                configuration files that, when taken together, define the kernel configuration for your BSP.
                You can accomplish this definition by putting the configurations in a file or a set of files 
                inside a directory located at the same level as your append file and having the same name 
                as the kernel.
                With all these conditions met simply reference those files in a SRC_URI statement in the append 
                file.
            </para>
            <para>
                For example, suppose you had a set of configuration options in a file called 
                <filename>defconfig</filename>.  
                If you put that file inside a directory named 
                <filename class='directory'>/linux-yocto</filename> and then added 
                a SRC_URI statement such as the following to the append file, those configuration
                options will be picked up and applied when the kernel is built.
                <programlisting>
SRC_URI += "file://defconfig"
                </programlisting>
            </para>
            <para>
                As mentioned earlier, you can group related configurations into multiple files and 
                name them all in the SRC_URI statement as well.
                For example, you could group separate configurations specifically for Ethernet and graphics
                into their own files and add those by using a SRC_URI statement like the 
                following in your append file:
                <programlisting>
SRC_URI += "file://defconfig \
            file://eth.cfg \
            file://gfx.cfg"
                </programlisting>
            </para>
            <para>
                The FILESEXTRAPATHS variable is in boilerplate form here in order to make it easy 
                to do that.
                It basically allows those configuration files to be found by the build process.
            </para>
            <note><para>
                Other methods exist to accomplish grouping and defining configuration options.
                For example, you could directly add configuration options to the Yocto kernel 
                <filename class='directory'>meta</filename> branch for your BSP.
                The configuration options will likely end up in that location anyway if the BSP gets 
                added to the Yocto Project. 
                For information on how to add these configurations directly, see the 
                "Yocto Project Kernel Architecture and Use Manual" on the 
                <ulink url="http://yoctoproject.org/community/documentation">Yocto Project website
                Documentation Page</ulink> 
            </para>
            <para>
                In general, however, the Yocto Project maintainers take care of moving the SRC_URI-specified 
                configuration options to the <filename class='directory'>meta</filename> branch.
                Not only is it easier for BSP developers to not have to worry about putting those 
                configurations in the branch, but having the maintainers do it allows them to apply 
                'global' knowledge about the kinds of common configuration options multiple BSPs in 
                the tree are typically using.  
                This allows for promotion of common configurations into common features.
            </para></note>
            </section>

<!--        <section id='bsp-filelayout-packages'>
            <title>Other Software (meta-&lt;bsp_name&gt;/recipes-kernel/*)</title>

            <para>
                This section describes other pieces of software that the hardware might need for best
                operation. 
                Examples show some of the things you could encounter.  
                The examples are standard <filename>.bb</filename> file recipes in the 
                usual Poky format.  
                You can include the source directly by referring to it in the source control system or 
                the released tarballs of external software projects.
                You only need to provide these types of files if the platform requires them.
            </para>
            <para>
                The following file is a bootloader recipe that can be used to generate a new
                bootloader binary. 
                Sometimes these files are included in the final image format and are needed to re-flash hardware.
            </para>
            <para>
               <programlisting>
meta-Emenlow/recipes-kernel/bootloader/bootloader_0.1.bb
               </programlisting>
            </para>
            <para>
                These next two files are examples of a hardware driver and a hardware daemon that might need
                to be included in images to make the hardware useful. 
                Although the example uses "modem" there may be other components needed, such as firmware.
            </para>
            <para>
               <programlisting>
meta-Emenlow/recipes-Emenlow/modem/modem-driver_0.1.bb
meta-Emenlow/recipes-Emenlow/modem/modem-daemon_0.1.bb
               </programlisting>
            </para>
            <para>
                Sometimes the device needs an image in a very specific format so that the update
                mechanism can accept and re-flash it. 
                Recipes to build the tools needed to do this can be included with the BSP.
                Following is an example.
            </para>
            <para>
               <programlisting>
meta-Emenlow/recipes-Emenlow/image-creator/image-creator-native_0.1.bb
               </programlisting>
            </para>
            </section>

            <section id='bs-filelayout-bbappend'>
            <title>Append BSP-Specific Information to Existing Recipes</title>
            <para>
                Suppose you have a recipe such as "pointercal" that requires machine-specific information.
                At the same time, you have your new BSP code nicely partitioned into a layer through which  
                you would also like to specify any machine-specific information associated with your new machine. 
                Before the <filename>.bbappend</filename> extension was introduced, you would have to copy the whole
                pointercal recipe and files into your layer and then add the single file for your machine.
            </para>
            <para>
                With the <filename>.bbappend</filename> extension, however, your work becomes much easier.
                This extension allows you to easily merge BSP-specific information with the original recipe.
                Whenever BitBake finds any <filename>.bbappend</filename> files BitBake will include them after
                it loads the associated <filename>.bb</filename> file but before any finalize 
                or anonymous methods are run.
                This allows the BSP layer to do whatever it might want to do to customize the original recipe.
            </para>
            <para>
                If your recipe needs to reference extra files it can use the FILESEXTRAPATHS variable
                to specify their location. 
                The example below shows extra files contained in a folder called ${PN} (the package name).
            </para>
            <programlisting>
FILESEXTRAPATHS := "${THISDIR}/${PN}"
            </programlisting>
            <para>
            This technique allows the BSP to add machine-specific configuration files to the layer directory, 
            which will be picked up by BitBake. 
            For an example see <filename>meta-emenlow/packages/formfactor</filename>.
            </para>
            </section>

            <section id="bsp-filelayout-prebuilds">
            <title>Pre-build Data (meta-&lt;bsp_name&gt;/prebuilds/*)</title>
            <para>
                This location can contain precompiled representations of the source code 
                contained elsewhere in the BSP layer. 
                Assuming a compatible configuration is used, Poky can process and use these optional pre-compiled 
                representations to provide much faster build times.
            </para>
            </section> -->
        </section>

        <section id='bsp-click-through-licensing'>
            <title>BSP 'Click-Through' Licensing Procedure</title>

            <note><para> This section describes how
		click-through licensing is expected to work.
                Currently, this functionality is not yet implemented.
            </para></note>

            <para>
	      In some cases, a BSP contains separately licensed IP
	      (Intellectual Property) for a component that imposes
	      upon the user a requirement to accept the terms of a
	      'click-through' license.  
              Once the license is accepted the
	      Poky build system can then build and include the
	      corresponding component in the final BSP image.  
              Some affected components might be essential to the normal
	      functioning of the system and have no 'free' replacement
	      (i.e. the resulting system would be non-functional
	      without them).
              On the other hand, other components might be simply
	      'good-to-have' or purely elective, or if essential
	      nonetheless have a 'free' (possibly less-capable)
	      version that could be used as a in the BSP recipe.
            </para>

            <para>
	      For cases where you can substitute something and still maintain functionality, 
              the Yocto Project website's  
              <ulink url='http://www.yoctoproject.org/download/all?keys=&amp;download_type=1&amp;download_version='>BSP Download Page</ulink> 
              makes available 'de-featured' BSPs that are completely free of any IP encumbrances.
              For these cases you can use the substitution directly and without any further licensing
              requirements.  
              If present, these fully 'de-featured' BSPs are named appropriately different 
              as compared to the names of the respective encumbered BSPs.
              If available, these substitutions are the simplest and most preferred options.
              This, of course, assumes the resulting functionality meets requirements.
            </para>

            <para>
	      If however, a non-encumbered version is unavailable or the 'free' version 
              would provide unsuitable functionality or quality, you can use 
              an encumbered version.  
            </para>

            <para>  
              Several methods exist within the Poky build system to satisfy the licensing
	      requirements for an encumbered BSP.
              The following list describes them in preferential order:
            </para>

	    <orderedlist>
            <listitem>

		<para>
		  Get a license key (or keys) for the encumbered BSP by visiting 
                  a website and providing the name of the BSP and your email address
                  through a web form.
                </para>
 
<!--
                  <ulink url='https://pokylinux.org/bsp-keys.html'>https://pokylinux.org/bsp-keys.html</ulink>
		  and give the name of the BSP and your e-mail address in the web form.
		</para>

                COMMENT:  This link is not implemented at this point.  

		<programlisting>
		  [screenshot of dialog box]
		</programlisting>

-->

		<para>
		  After agreeing to any applicable license terms, the
		  BSP key(s) will be immediately sent to the address
		  you gave and you can use them by specifying BSPKEY_&lt;keydomain&gt;
		  environment variables when building the image:
		</para>

		<programlisting>
		  $ BSPKEY_&lt;keydomain&gt;=&lt;key&gt; bitbake core-image-sato
		</programlisting>

		<para>
		  These steps allow the encumbered image to be built
		  with no change at all to the normal build process.
		</para>

		<para>
		  Equivalently and probably more conveniently, a line
		  for each key can instead be put into the user's
		  <filename>local.conf</filename> file.
		</para>

		<para>
		  The &lt;keydomain&gt; component of the
		  BSPKEY_&lt;keydomain&gt; is required because there
		  might be multiple licenses in effect for a given BSP.
                  In such cases, a given &lt;keydomain&gt; corresponds to
		  a particular license.  In order for an encumbered
		  BSP that encompasses multiple key domains to be built
		  successfully, a &lt;keydomain&gt; entry for each
		  applicable license must be present in <filename>local.conf</filename> or
		  supplied on the command-line.
		</para>
              </listitem> 
              <listitem>
		<para>
		  Do nothing - build as you normally would.
                  When a license is needed the build will stop and prompt you with instructions.
                  Follow the license prompts that originate from the
		  encumbered BSP.  
                  These prompts usually take the form of instructions
		  needed to manually fetch the encumbered package(s)
		  and md5 sums into the required directory 
                  (e.g. the <filename>poky/build/downloads</filename>).
                  Once the manual package fetch has been
		  completed, restart the build to continue where
		  it left off.
                  During the build the prompt will not appear again since you have satisfied the 
                  requirement.
		</para>
              </listitem>
              <listitem>
		<para>
		  Get a full-featured BSP recipe rather than a key.
                  You can do this by visiting the applicable BSP download page from the Yocto 
                  Project website at
                  <ulink url='http://yoctoproject.org/download/board-support-package-bsp-downloads'></ulink>.
		  BSP tarballs that have proprietary information can be downloaded after agreeing 
                  to licensing requirements as part of the download process. 
                  Obtaining the code this way allows you to build an encumbered image with 
                  no changes at all as compared to the normal build. 
                </para>
              </listitem>
	    </orderedlist>
	    <para>
	      Note that the third method is also the only option available
	      when downloading pre-compiled images generated from non-free BSPs.  
              Those images are likewise available at from the Yocto Project website.
            </para> 
        </section>

</chapter>