summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJason Wessel <jason.wessel@windriver.com>2013-03-04 23:48:41 +0000
committerRichard Purdie <richard.purdie@linuxfoundation.org>2013-03-18 21:42:24 +0000
commit87cfde2559daec564731c5c25df04eec27eaf7d5 (patch)
tree99b2d83697141106a0e30909f12dff90f4795203
parent04cd51c8ac2b33476ca1b0c6467bceea76ceb636 (diff)
downloadpoky-87cfde2559daec564731c5c25df04eec27eaf7d5.tar.gz
syslinux.bbclass: Add a default serial console option and real boot menu support
The previous syslinux menu code did not support using both a serial and vga console, but this has worked for years in syslinux so there is no reason not to take advantage of it. The previous menu looked like: ------------------------------------------------------- Linux Boot Menu The following targets are available on this image: boot: None install: None ------------------------------------------------------- This commit makes it look something more like a traditional grub menu on both the serial console and vga console as well as providing the option to continue on using either the serial or vga console with the correct kernel arguments. You can see the screen shots attached to the bugzilla. https://bugzilla.yoctoproject.org/show_bug.cgi?id=3944 [ YOCTO #3944 ] (From OE-Core rev: 7032d559c04bae09e6b7c39ddeb1bf35acc0584c) Signed-off-by: Jason Wessel <jason.wessel@windriver.com> Signed-off-by: Saul Wold <sgw@linux.intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r--meta/classes/syslinux.bbclass128
1 files changed, 49 insertions, 79 deletions
diff --git a/meta/classes/syslinux.bbclass b/meta/classes/syslinux.bbclass
index c4596bffce..0b90eab228 100644
--- a/meta/classes/syslinux.bbclass
+++ b/meta/classes/syslinux.bbclass
@@ -11,15 +11,17 @@
11# ${LABELS} - a list of targets for the automatic config 11# ${LABELS} - a list of targets for the automatic config
12# ${APPEND} - an override list of append strings for each label 12# ${APPEND} - an override list of append strings for each label
13# ${SYSLINUX_OPTS} - additional options to add to the syslinux file ';' delimited 13# ${SYSLINUX_OPTS} - additional options to add to the syslinux file ';' delimited
14# ${SYSLINUX_SPLASH} - A background for the vga boot menu if using the boot menu
15# ${SYSLINUX_SERIAL} - Set an alternate serial port or turn off serial with empty string
14 16
15do_bootimg[depends] += "syslinux:do_populate_sysroot \ 17do_bootimg[depends] += "syslinux:do_populate_sysroot \
16 syslinux-native:do_populate_sysroot" 18 syslinux-native:do_populate_sysroot"
17 19
18SYSLINUXCFG = "${S}/syslinux.cfg" 20SYSLINUXCFG = "${S}/syslinux.cfg"
19SYSLINUXMENU = "${S}/menu"
20 21
21ISOLINUXDIR = "/isolinux" 22ISOLINUXDIR = "/isolinux"
22SYSLINUXDIR = "/" 23SYSLINUXDIR = "/"
24SYSLINUX_SERIAL ?= "0 115200"
23ISO_BOOTIMG = "isolinux/isolinux.bin" 25ISO_BOOTIMG = "isolinux/isolinux.bin"
24ISO_BOOTCAT = "isolinux/boot.cat" 26ISO_BOOTCAT = "isolinux/boot.cat"
25MKISOFS_OPTIONS = "-no-emul-boot -boot-load-size 4 -boot-info-table" 27MKISOFS_OPTIONS = "-no-emul-boot -boot-load-size 4 -boot-info-table"
@@ -34,82 +36,34 @@ syslinux_populate() {
34 36
35 # Install the config files 37 # Install the config files
36 install -m 0644 ${SYSLINUXCFG} ${DEST}${BOOTDIR}/${CFGNAME} 38 install -m 0644 ${SYSLINUXCFG} ${DEST}${BOOTDIR}/${CFGNAME}
37 if [ -f ${SYSLINUXMENU} ]; then
38 install -m 0644 ${SYSLINUXMENU} ${DEST}${BOOTDIR}
39 fi
40} 39}
41 40
42syslinux_iso_populate() { 41syslinux_iso_populate() {
43 syslinux_populate ${ISODIR} ${ISOLINUXDIR} isolinux.cfg 42 syslinux_populate ${ISODIR} ${ISOLINUXDIR} isolinux.cfg
44 install -m 0644 ${STAGING_LIBDIR}/syslinux/isolinux.bin ${ISODIR}${ISOLINUXDIR} 43 install -m 0644 ${STAGING_LIBDIR}/syslinux/isolinux.bin ${ISODIR}${ISOLINUXDIR}
44 if [ "${AUTO_SYSLINUXMENU}" = 1 ] ; then
45 install -m 0644 ${STAGING_LIBDIR}/syslinux/vesamenu.c32 ${ISODIR}${ISOLINUXDIR}/vesamenu.c32
46 if [ "${SYSLINUX_SPLASH}" != "" ] ; then
47 install -m 0644 ${SYSLINUX_SPLASH} ${ISODIR}${ISOLINUXDIR}/splash.lss
48 fi
49 fi
45} 50}
46 51
47syslinux_hddimg_populate() { 52syslinux_hddimg_populate() {
48 syslinux_populate ${HDDDIR} ${SYSLINUXDIR} syslinux.cfg 53 syslinux_populate ${HDDDIR} ${SYSLINUXDIR} syslinux.cfg
49 install -m 0444 ${STAGING_LIBDIR}/syslinux/ldlinux.sys ${HDDDIR}${SYSLINUXDIR}/ldlinux.sys 54 install -m 0444 ${STAGING_LIBDIR}/syslinux/ldlinux.sys ${HDDDIR}${SYSLINUXDIR}/ldlinux.sys
55 if [ "${AUTO_SYSLINUXMENU}" = 1 ] ; then
56 install -m 0644 ${STAGING_LIBDIR}/syslinux/vesamenu.c32 ${HDDDIR}${SYSLINUXDIR}/vesamenu.c32
57 if [ "${SYSLINUX_SPLASH}" != "" ] ; then
58 install -m 0644 ${SYSLINUX_SPLASH} ${HDDDIR}${SYSLINUXDIR}/splash.lss
59 fi
60 fi
50} 61}
51 62
52syslinux_hddimg_install() { 63syslinux_hddimg_install() {
53 syslinux ${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.hddimg 64 syslinux ${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.hddimg
54} 65}
55 66
56python build_syslinux_menu () {
57 import copy
58 import sys
59
60 workdir = d.getVar('WORKDIR', True)
61 if not workdir:
62 bb.error("WORKDIR is not defined")
63 return
64
65 labels = d.getVar('LABELS', True)
66 if not labels:
67 bb.debug(1, "LABELS not defined, nothing to do")
68 return
69
70 if labels == []:
71 bb.debug(1, "No labels, nothing to do")
72 return
73
74 cfile = d.getVar('SYSLINUXMENU', True)
75 if not cfile:
76 raise bb.build.FuncFailed('Unable to read SYSLINUXMENU')
77
78 try:
79 cfgfile = file(cfile, 'w')
80 except OSError:
81 raise bb.build.funcFailed('Unable to open %s' % (cfile))
82
83 # Beep the speaker and Clear the screen
84 cfgfile.write('\x07\x0C')
85
86 # The title should be configurable
87 cfgfile.write('Linux Boot Menu\n')
88 cfgfile.write('The following targets are available on this image:\n')
89 cfgfile.write('\n')
90
91 for label in labels.split():
92 from copy import deepcopy
93 localdata = deepcopy(d)
94
95 overrides = localdata.getVar('OVERRIDES')
96 if not overrides:
97 raise bb.build.FuncFailed('OVERRIDES not defined')
98 overrides = localdata.expand(overrides)
99
100 localdata.setVar('OVERRIDES', label + ':' + overrides)
101 bb.data.update_data(localdata)
102
103 usage = localdata.getVar('USAGE', True)
104 cfgfile.write(' \x0F\x30\x3E%16s\x0F\x30\x37: ' % (label))
105 cfgfile.write('%s\n' % (usage))
106
107 del localdata
108
109 cfgfile.write('\n')
110 cfgfile.close()
111}
112
113python build_syslinux_cfg () { 67python build_syslinux_cfg () {
114 import copy 68 import copy
115 import sys 69 import sys
@@ -146,7 +100,16 @@ python build_syslinux_cfg () {
146 cfgfile.write('%s\n' % opt) 100 cfgfile.write('%s\n' % opt)
147 101
148 cfgfile.write('ALLOWOPTIONS 1\n'); 102 cfgfile.write('ALLOWOPTIONS 1\n');
149 cfgfile.write('DEFAULT %s\n' % (labels.split()[0])) 103 syslinux_serial = d.getVar('SYSLINUX_SERIAL', True)
104 if syslinux_serial:
105 cfgfile.write('SERIAL %s\n' % syslinux_serial)
106
107 menu = d.getVar('AUTO_SYSLINUXMENU', True)
108
109 if menu and syslinux_serial:
110 cfgfile.write('DEFAULT Graphics console %s\n' % (labels.split()[0]))
111 else:
112 cfgfile.write('DEFAULT %s\n' % (labels.split()[0]))
150 113
151 timeout = d.getVar('SYSLINUX_TIMEOUT', True) 114 timeout = d.getVar('SYSLINUX_TIMEOUT', True)
152 115
@@ -161,14 +124,13 @@ python build_syslinux_cfg () {
161 else: 124 else:
162 cfgfile.write('PROMPT 1\n') 125 cfgfile.write('PROMPT 1\n')
163 126
164 menu = d.getVar('AUTO_SYSLINUXMENU', True)
165
166 # This is ugly. My bad.
167
168 if menu: 127 if menu:
169 bb.build.exec_func('build_syslinux_menu', d) 128 cfgfile.write('ui vesamenu.c32\n')
170 mfile = d.getVar('SYSLINUXMENU', True) 129 cfgfile.write('menu title Select kernel options and boot kernel\n')
171 cfgfile.write('DISPLAY %s\n' % (mfile.split('/')[-1]) ) 130 cfgfile.write('menu tabmsg Press [Tab] to edit, [Return] to select\n')
131 splash = d.getVar('SYSLINUX_SPLASH', True)
132 if splash:
133 cfgfile.write('menu background splash.lss\n')
172 134
173 for label in labels.split(): 135 for label in labels.split():
174 localdata = bb.data.createCopy(d) 136 localdata = bb.data.createCopy(d)
@@ -176,24 +138,32 @@ python build_syslinux_cfg () {
176 overrides = localdata.getVar('OVERRIDES', True) 138 overrides = localdata.getVar('OVERRIDES', True)
177 if not overrides: 139 if not overrides:
178 raise bb.build.FuncFailed('OVERRIDES not defined') 140 raise bb.build.FuncFailed('OVERRIDES not defined')
179 141
180 localdata.setVar('OVERRIDES', label + ':' + overrides) 142 localdata.setVar('OVERRIDES', label + ':' + overrides)
181 bb.data.update_data(localdata) 143 bb.data.update_data(localdata)
182 144
183 cfgfile.write('LABEL %s\nKERNEL /vmlinuz\n' % (label)) 145 btypes = [ [ "", "console=tty0" ] ]
146 if menu and syslinux_serial:
147 btypes = [ [ "Graphics console ", " console=tty0" ],
148 [ "Serial console ", " console=ttyS0,115200" ] ]
149
150 for btype in btypes:
151 cfgfile.write('LABEL %s%s\nKERNEL /vmlinuz\n' % (btype[0], label))
184 152
185 append = localdata.getVar('APPEND', True) 153 append = localdata.getVar('APPEND', True)
186 initrd = localdata.getVar('INITRD', True) 154 initrd = localdata.getVar('INITRD', True)
187 155
188 if append: 156 if append:
189 cfgfile.write('APPEND ') 157 cfgfile.write('APPEND ')
190 158
191 if initrd: 159 if initrd:
192 cfgfile.write('initrd=/initrd ') 160 cfgfile.write('initrd=/initrd ')
193 161
194 cfgfile.write('LABEL=%s '% (label)) 162 cfgfile.write('LABEL=%s '% (label))
195 163
196 cfgfile.write('%s\n' % (append)) 164 cfgfile.write('%s %s\n' % (append, btype[1]))
165 else:
166 cfgfile.write('APPEND %s\n' % btype[1])
197 167
198 cfgfile.close() 168 cfgfile.close()
199} 169}