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