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