diff options
Diffstat (limited to 'src/serial.inc')
-rw-r--r-- | src/serial.inc | 517 |
1 files changed, 517 insertions, 0 deletions
diff --git a/src/serial.inc b/src/serial.inc new file mode 100644 index 0000000..94e5434 --- /dev/null +++ b/src/serial.inc @@ -0,0 +1,517 @@ +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% Some vars. + +/act.nop 0 def +/act.boot 1 def + +/.sm.setup 0 def +/.sm.ok 1 def + +/serial.action act.nop def + +/serial.setup /serial.setup.start def + +/serial.menu.index 0 def + +/serial.line.status 0 def + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% serial line input event handling +% +% ( key -- input_buffer menu_entry action ) +% +% key +% bit 0-7 ascii +% bit 24-32 scan code (0xf0 + serial line number) +% +% action +% 0: ok, stay in input loop +% 1: switch to text mode +% >=2: start linux +% +/serial.input { + dup 24 shr 0x0f and 1 exch shl serial.line.status or /serial.line.status exch def + + 0xffffff and + + % ^? -> ^H + dup 0x7f eq { pop 8 } if + + serial.setup exec + + serial.edit + dup 0 eq { pop "" -1 0 return } if + + 1 eq { serial.menu.ok } { serial.menu.prev } ifelse + + window.action actCloseInfo eq { + /window.action actNothing def + window.done + } if + + serial.action act.boot eq { + % /serial.setup serial.menu.layout serial.menu.index get .sm.setup get def + + serial.cmdline serial.menu_idx 2 + return + } if + + "" -1 0 +} def + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% Write string to serial line. +% +% ( str1 -- ) +% +/serial.show { + { + dup 0x0a eq { 0x0d serial.putc } if + serial.putc + } forall +} def + + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% ( str1 -- ) +% +/serial.edit.init { + serial.edit.buf exch strcpy + "> " serial.show serial.show +} def + +/serial.edit.buf 1024 string def + + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% ( int1 -- int2 ) +% +/serial.edit { + dup 0x0d eq { + "\n\n" serial.show + pop 1 return + } if + + dup 0x1b eq { + "\n\n" serial.show + pop 2 return + } if + + dup 0x08 eq { + serial.edit.buf length 0 gt { + serial.edit.buf dup length 1 sub 0 put + "\x08 \x08" serial.show + } if + pop 0 return + } if + + dup 0x15 eq { + serial.edit.buf length 0 gt { + serial.edit.buf length { + "\x08 \x08" serial.show + } repeat + serial.edit.buf 0 0 put + } if + pop 0 return + } if + + dup 0x20 ge over 0x7e le and { + serial.edit.buf cvp length serial.edit.buf length 1 add gt { + serial.edit.buf dup length add dup 1 0 put 0 2 index put + + serial.putc 0 return + } if + } if + + pop 0 +} def + + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% ( -- ) +% +/serial.smenu.init { + "\n=== " serial.show + smenu .xm_title get exec serial.show + " ===\n\n" serial.show + smenu .xm_text get exec serial.show + "\n\n" serial.show + + /serial.smenu.cnt 0 def + /serial.smenu.tmp 256 string def + + smenu .xm_list get { + exec + serial.smenu.cnt smenu .xm_current get eq { " * " } { " " } ifelse + /serial.smenu.cnt inc + serial.smenu.cnt + smenu .xm_list get length 10 ge { "%2d)%s%s\n" } { "%d)%s%s\n" } ifelse + serial.smenu.tmp sprintf + serial.smenu.tmp serial.show + } forall + + /serial.smenu.tmp xfree + + "\n" serial.show + + "" serial.edit.init +} def + + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% Draw main menu. +% +% ( int1 -- int2 ) +% +% int1: key +% int2: key +% +/serial.setup.start { + /serial.menu.layout [ + [ /serial.main.setup /serial.main.ok ] + xmenu.bits .xm_list get length 1 gt { [ /serial.bits.setup /serial.bits.ok ] } if + xmenu.kernelopts .undef ne { [ /serial.kernel.setup /serial.kernel.ok ] } if + [ /serial.options.setup /serial.options.ok ] + [ /serial.infobox.setup /serial.infobox.ok ] + ] def + + % go for text mode (or use 0?) + xmenu.video .xm_current 1 put + + "\nopenSUSE 11.1 installation\n\n" serial.show + + /serial.setup /serial.nop def + + serial.menu.again + + pop 0 +} def + + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% Setup main menu. +% +% ( -- ) +% +/serial.main.setup { + smenu.main .undef eq { + /smenu.main .xm_size array def + + smenu.main .xm_current menu.entry put + smenu.main .xm_title "Main Menu" put + smenu.main .xm_text "Select a boot entry." put + smenu.main .xm_list [ menu.texts { menuitemmap } forall ] put + } if + + /smenu smenu.main def + + serial.smenu.init + +} def + + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% Leave main menu. +% +% ( -- ) +% +/serial.main.ok { + serial.edit.buf to_number + + menu.entry false MenuSelect + + serial.smenu.select { + /menu.entry smenu .xm_current get def + serial.menu.next + } { + serial.menu.again + } ifelse + + menu.entry true MenuSelect +} def + + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% Setup kernel menu. +% +% ( -- ) +% +/serial.kernel.setup { + xmenu.kernelopts .xm_text "Select a predefined set of kernel options." put + + /smenu xmenu.kernelopts def + + serial.smenu.init +} def + + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% Leave kernel menu. +% +% ( -- ) +% +/serial.kernel.ok { + serial.edit.buf to_number + serial.smenu.select { serial.menu.next } { serial.menu.again } ifelse +} def + + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% Setup arch menu. +% +% ( -- ) +% +/serial.bits.setup { + xmenu.bits .xm_text "32 or 64 bit?" put + + /smenu xmenu.bits def + + serial.smenu.init +} def + + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% Leave arch menu. +% +% ( -- ) +% +/serial.bits.ok { + serial.edit.buf to_number + serial.smenu.select { serial.menu.next } { serial.menu.again } ifelse +} def + + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% Setup lang menu. +% +% ( -- ) +% +/serial.lang.setup { + /smenu xmenu.lang def + + serial.smenu.init +} def + + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% Leave lang menu. +% +% ( -- ) +% +/serial.lang.ok { + serial.edit.buf to_number + serial.smenu.select { serial.menu.next } { serial.menu.again } ifelse +} def + + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% Setup options menu. +% +% ( -- ) +% +/serial.options.setup { + "=== Boot Options ===\n" serial.show + +" +Edit boot options. + +- lang=<locale> selects the default language +- install=<url> sets the install repository +- dud=<url> adds a driverupdate (option can be given more than once) + +" + serial.show + + boot.ed.list buildcmdline /serial.menu_idx exch def /serial.cmdline exch def + + serial.console.option dup .undef ne { + " %s" serial.cmdline dup length add sprintf + } { pop } ifelse + + serial.cmdline serial.edit.init +} def + + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% Options -> Boot. +% +% ( -- ) +% +/serial.options.ok { + serial.cmdline serial.edit.buf strcpy pop + + % point to infobox + /serial.menu.index inc + + /serial.action act.boot def +} def + + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% Setup infobox. +% +% ( -- ) +% +/serial.infobox.setup { + /smenu serial.infobox def + + serial.smenu.init +} def + + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% Leave infobox. +% +% ( -- ) +% +/serial.infobox.ok { + serial.edit.buf to_number + serial.smenu.select { + serial.menu.prev + /window.action actCloseInfo def + } { + serial.menu.again + } ifelse +} def + + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% Do nothing. +% +% ( -- ) +% +/serial.nop { +} def + + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% Convert String to number. +% +% ( str1 -- int1 ) +% +% Returns -1 if str1 is not a number. +% +/to_number { + dup cvn + dup 0 ne { exch pop return } if + pop + dup "" eq exch "0" eq or { 0 } { -1 } ifelse +} def + + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% Ensure serial.menu.index has a valid value. +% +% ( -- ) +% +/serial.menu.index.normalize { + serial.menu.index serial.menu.layout length gt { /serial.menu.index serial.menu.layout length def } if + serial.menu.index 0 lt { /serial.menu.index 0 def } if +} def + + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% Reinit current menu. +% +% ( -- ) +% +/serial.menu.again { + serial.menu.index.normalize + serial.menu.layout serial.menu.index get .sm.setup get exec +} def + + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% Run 'ok' action for current menu. +% +% ( -- ) +% +/serial.menu.ok { + serial.menu.index.normalize + serial.menu.layout serial.menu.index get .sm.ok get exec +} def + + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% Go to next menu. +% +% ( -- ) +% +/serial.menu.next { + /serial.menu.index inc + serial.menu.again +} def + + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% Go to previous menu. +% +% ( -- ) +% +/serial.menu.prev { + /serial.menu.index dec + serial.menu.again +} def + + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% Select menu item (update smenu->.xm_current). +% +% ( int1 -- bool1 ) +% +/serial.smenu.select { + smenu .xm_list get length over lt over 0 lt or { + pop + + false + } { + dup 0 eq { pop smenu .xm_current get 1 add } if + + 1 sub smenu .xm_current rot put + + true + } ifelse +} def + + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% Build 'console' option for kernel. +% +% ( -- str1 ) +% +/serial.console.option { + + /serial.tmp.bm 0 def + { + serial.line.status 1 serial.tmp.bm shl and { exit } if + /serial.tmp.bm inc + serial.tmp.bm 8 ge { /serial.tmp.bm .undef def exit } if + } loop + + serial.tmp.bm .undef eq { .undef return } if + serial.lines length serial.tmp.bm le { .undef return } if + + serial.lines serial.tmp.bm get 2 aget dup .undef ne { + serial.tmp.bm serial.getbaud exch + "console=%s,%d" serial.console.buf sprintf + serial.console.buf + } if + +} def + +/serial.console.buf 64 string def + + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% Setup serial lines. +% +0 1 serial.lines length 1 sub { + serial.lines over get dup length 2 ge { + dup 0 get cvn exch 1 get cvn serial.setconfig + } { + pop pop + } ifelse +} for + +serial.init + |