xref: /OK3568_Linux_fs/yocto/poky/meta/classes/uboot-extlinux-config.bbclass (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun# uboot-extlinux-config.bbclass
2*4882a593Smuzhiyun#
3*4882a593Smuzhiyun# This class allow the extlinux.conf generation for U-Boot use. The
4*4882a593Smuzhiyun# U-Boot support for it is given to allow the Generic Distribution
5*4882a593Smuzhiyun# Configuration specification use by OpenEmbedded-based products.
6*4882a593Smuzhiyun#
7*4882a593Smuzhiyun# External variables:
8*4882a593Smuzhiyun#
9*4882a593Smuzhiyun# UBOOT_EXTLINUX_CONSOLE           - Set to "console=ttyX" to change kernel boot
10*4882a593Smuzhiyun#                                    default console.
11*4882a593Smuzhiyun# UBOOT_EXTLINUX_LABELS            - A list of targets for the automatic config.
12*4882a593Smuzhiyun# UBOOT_EXTLINUX_KERNEL_ARGS       - Add additional kernel arguments.
13*4882a593Smuzhiyun# UBOOT_EXTLINUX_KERNEL_IMAGE      - Kernel image name.
14*4882a593Smuzhiyun# UBOOT_EXTLINUX_FDTDIR            - Device tree directory.
15*4882a593Smuzhiyun# UBOOT_EXTLINUX_FDT               - Device tree file.
16*4882a593Smuzhiyun# UBOOT_EXTLINUX_INITRD            - Indicates a list of filesystem images to
17*4882a593Smuzhiyun#                                    concatenate and use as an initrd (optional).
18*4882a593Smuzhiyun# UBOOT_EXTLINUX_MENU_DESCRIPTION  - Name to use as description.
19*4882a593Smuzhiyun# UBOOT_EXTLINUX_ROOT              - Root kernel cmdline.
20*4882a593Smuzhiyun# UBOOT_EXTLINUX_TIMEOUT           - Timeout before DEFAULT selection is made.
21*4882a593Smuzhiyun#                                    Measured in 1/10 of a second.
22*4882a593Smuzhiyun# UBOOT_EXTLINUX_DEFAULT_LABEL     - Target to be selected by default after
23*4882a593Smuzhiyun#                                    the timeout period
24*4882a593Smuzhiyun#
25*4882a593Smuzhiyun# If there's only one label system will boot automatically and menu won't be
26*4882a593Smuzhiyun# created. If you want to use more than one labels, e.g linux and alternate,
27*4882a593Smuzhiyun# use overrides to set menu description, console and others variables.
28*4882a593Smuzhiyun#
29*4882a593Smuzhiyun# Ex:
30*4882a593Smuzhiyun#
31*4882a593Smuzhiyun# UBOOT_EXTLINUX_LABELS ??= "default fallback"
32*4882a593Smuzhiyun#
33*4882a593Smuzhiyun# UBOOT_EXTLINUX_DEFAULT_LABEL ??= "Linux Default"
34*4882a593Smuzhiyun# UBOOT_EXTLINUX_TIMEOUT ??= "30"
35*4882a593Smuzhiyun#
36*4882a593Smuzhiyun# UBOOT_EXTLINUX_KERNEL_IMAGE_default ??= "../zImage"
37*4882a593Smuzhiyun# UBOOT_EXTLINUX_MENU_DESCRIPTION_default ??= "Linux Default"
38*4882a593Smuzhiyun#
39*4882a593Smuzhiyun# UBOOT_EXTLINUX_KERNEL_IMAGE_fallback ??= "../zImage-fallback"
40*4882a593Smuzhiyun# UBOOT_EXTLINUX_MENU_DESCRIPTION_fallback ??= "Linux Fallback"
41*4882a593Smuzhiyun#
42*4882a593Smuzhiyun# Results:
43*4882a593Smuzhiyun#
44*4882a593Smuzhiyun# menu title Select the boot mode
45*4882a593Smuzhiyun# TIMEOUT 30
46*4882a593Smuzhiyun# DEFAULT Linux Default
47*4882a593Smuzhiyun# LABEL Linux Default
48*4882a593Smuzhiyun#   KERNEL ../zImage
49*4882a593Smuzhiyun#   FDTDIR ../
50*4882a593Smuzhiyun#   APPEND root=/dev/mmcblk2p2 rootwait rw console=${console}
51*4882a593Smuzhiyun# LABEL Linux Fallback
52*4882a593Smuzhiyun#   KERNEL ../zImage-fallback
53*4882a593Smuzhiyun#   FDTDIR ../
54*4882a593Smuzhiyun#   APPEND root=/dev/mmcblk2p2 rootwait rw console=${console}
55*4882a593Smuzhiyun#
56*4882a593Smuzhiyun# Copyright (C) 2016, O.S. Systems Software LTDA.  All Rights Reserved
57*4882a593Smuzhiyun# Released under the MIT license (see packages/COPYING)
58*4882a593Smuzhiyun#
59*4882a593Smuzhiyun# The kernel has an internal default console, which you can override with
60*4882a593Smuzhiyun# a console=...some_tty...
61*4882a593SmuzhiyunUBOOT_EXTLINUX_CONSOLE ??= "console=${console},${baudrate}"
62*4882a593SmuzhiyunUBOOT_EXTLINUX_LABELS ??= "linux"
63*4882a593SmuzhiyunUBOOT_EXTLINUX_FDT ??= ""
64*4882a593SmuzhiyunUBOOT_EXTLINUX_FDTDIR ??= "../"
65*4882a593SmuzhiyunUBOOT_EXTLINUX_KERNEL_IMAGE ??= "../${KERNEL_IMAGETYPE}"
66*4882a593SmuzhiyunUBOOT_EXTLINUX_KERNEL_ARGS ??= "rootwait rw"
67*4882a593SmuzhiyunUBOOT_EXTLINUX_MENU_DESCRIPTION:linux ??= "${DISTRO_NAME}"
68*4882a593Smuzhiyun
69*4882a593SmuzhiyunUBOOT_EXTLINUX_CONFIG = "${B}/extlinux.conf"
70*4882a593Smuzhiyun
71*4882a593Smuzhiyunpython do_create_extlinux_config() {
72*4882a593Smuzhiyun    if d.getVar("UBOOT_EXTLINUX") != "1":
73*4882a593Smuzhiyun      return
74*4882a593Smuzhiyun
75*4882a593Smuzhiyun    if not d.getVar('WORKDIR'):
76*4882a593Smuzhiyun        bb.error("WORKDIR not defined, unable to package")
77*4882a593Smuzhiyun
78*4882a593Smuzhiyun    labels = d.getVar('UBOOT_EXTLINUX_LABELS')
79*4882a593Smuzhiyun    if not labels:
80*4882a593Smuzhiyun        bb.fatal("UBOOT_EXTLINUX_LABELS not defined, nothing to do")
81*4882a593Smuzhiyun
82*4882a593Smuzhiyun    if not labels.strip():
83*4882a593Smuzhiyun        bb.fatal("No labels, nothing to do")
84*4882a593Smuzhiyun
85*4882a593Smuzhiyun    cfile = d.getVar('UBOOT_EXTLINUX_CONFIG')
86*4882a593Smuzhiyun    if not cfile:
87*4882a593Smuzhiyun        bb.fatal('Unable to read UBOOT_EXTLINUX_CONFIG')
88*4882a593Smuzhiyun
89*4882a593Smuzhiyun    localdata = bb.data.createCopy(d)
90*4882a593Smuzhiyun
91*4882a593Smuzhiyun    try:
92*4882a593Smuzhiyun        with open(cfile, 'w') as cfgfile:
93*4882a593Smuzhiyun            cfgfile.write('# Generic Distro Configuration file generated by OpenEmbedded\n')
94*4882a593Smuzhiyun
95*4882a593Smuzhiyun            if len(labels.split()) > 1:
96*4882a593Smuzhiyun                cfgfile.write('menu title Select the boot mode\n')
97*4882a593Smuzhiyun
98*4882a593Smuzhiyun            timeout =  localdata.getVar('UBOOT_EXTLINUX_TIMEOUT')
99*4882a593Smuzhiyun            if timeout:
100*4882a593Smuzhiyun                cfgfile.write('TIMEOUT %s\n' % (timeout))
101*4882a593Smuzhiyun
102*4882a593Smuzhiyun            if len(labels.split()) > 1:
103*4882a593Smuzhiyun                default = localdata.getVar('UBOOT_EXTLINUX_DEFAULT_LABEL')
104*4882a593Smuzhiyun                if default:
105*4882a593Smuzhiyun                    cfgfile.write('DEFAULT %s\n' % (default))
106*4882a593Smuzhiyun
107*4882a593Smuzhiyun            # Need to deconflict the labels with existing overrides
108*4882a593Smuzhiyun            label_overrides = labels.split()
109*4882a593Smuzhiyun            default_overrides = localdata.getVar('OVERRIDES').split(':')
110*4882a593Smuzhiyun            # We're keeping all the existing overrides that aren't used as a label
111*4882a593Smuzhiyun            # an override for that label will be added back in while we're processing that label
112*4882a593Smuzhiyun            keep_overrides = list(filter(lambda x: x not in label_overrides, default_overrides))
113*4882a593Smuzhiyun
114*4882a593Smuzhiyun            for label in labels.split():
115*4882a593Smuzhiyun
116*4882a593Smuzhiyun                localdata.setVar('OVERRIDES', ':'.join(keep_overrides + [label]))
117*4882a593Smuzhiyun
118*4882a593Smuzhiyun                extlinux_console = localdata.getVar('UBOOT_EXTLINUX_CONSOLE')
119*4882a593Smuzhiyun
120*4882a593Smuzhiyun                menu_description = localdata.getVar('UBOOT_EXTLINUX_MENU_DESCRIPTION')
121*4882a593Smuzhiyun                if not menu_description:
122*4882a593Smuzhiyun                    menu_description = label
123*4882a593Smuzhiyun
124*4882a593Smuzhiyun                root = localdata.getVar('UBOOT_EXTLINUX_ROOT')
125*4882a593Smuzhiyun                if not root:
126*4882a593Smuzhiyun                    bb.fatal('UBOOT_EXTLINUX_ROOT not defined')
127*4882a593Smuzhiyun
128*4882a593Smuzhiyun                kernel_image = localdata.getVar('UBOOT_EXTLINUX_KERNEL_IMAGE')
129*4882a593Smuzhiyun                fdtdir = localdata.getVar('UBOOT_EXTLINUX_FDTDIR')
130*4882a593Smuzhiyun
131*4882a593Smuzhiyun                fdt = localdata.getVar('UBOOT_EXTLINUX_FDT')
132*4882a593Smuzhiyun
133*4882a593Smuzhiyun                if fdt:
134*4882a593Smuzhiyun                    cfgfile.write('LABEL %s\n\tKERNEL %s\n\tFDT %s\n' %
135*4882a593Smuzhiyun                                 (menu_description, kernel_image, fdt))
136*4882a593Smuzhiyun                elif fdtdir:
137*4882a593Smuzhiyun                    cfgfile.write('LABEL %s\n\tKERNEL %s\n\tFDTDIR %s\n' %
138*4882a593Smuzhiyun                                 (menu_description, kernel_image, fdtdir))
139*4882a593Smuzhiyun                else:
140*4882a593Smuzhiyun                    cfgfile.write('LABEL %s\n\tKERNEL %s\n' % (menu_description, kernel_image))
141*4882a593Smuzhiyun
142*4882a593Smuzhiyun                kernel_args = localdata.getVar('UBOOT_EXTLINUX_KERNEL_ARGS')
143*4882a593Smuzhiyun
144*4882a593Smuzhiyun                initrd = localdata.getVar('UBOOT_EXTLINUX_INITRD')
145*4882a593Smuzhiyun                if initrd:
146*4882a593Smuzhiyun                    cfgfile.write('\tINITRD %s\n'% initrd)
147*4882a593Smuzhiyun
148*4882a593Smuzhiyun                kernel_args = root + " " + kernel_args
149*4882a593Smuzhiyun                cfgfile.write('\tAPPEND %s %s\n' % (kernel_args, extlinux_console))
150*4882a593Smuzhiyun
151*4882a593Smuzhiyun    except OSError:
152*4882a593Smuzhiyun        bb.fatal('Unable to open %s' % (cfile))
153*4882a593Smuzhiyun}
154*4882a593SmuzhiyunUBOOT_EXTLINUX_VARS = "CONSOLE MENU_DESCRIPTION ROOT KERNEL_IMAGE FDTDIR FDT KERNEL_ARGS INITRD"
155*4882a593Smuzhiyundo_create_extlinux_config[vardeps] += "${@' '.join(['UBOOT_EXTLINUX_%s_%s' % (v, l) for v in d.getVar('UBOOT_EXTLINUX_VARS').split() for l in d.getVar('UBOOT_EXTLINUX_LABELS').split()])}"
156*4882a593Smuzhiyundo_create_extlinux_config[vardepsexclude] += "OVERRIDES"
157*4882a593Smuzhiyun
158*4882a593Smuzhiyunaddtask create_extlinux_config before do_install do_deploy after do_compile
159