#
# Build
#

assert_spec x86

set build_components { core init timer server/dynamic_rom server/event_dump }

source ${genode_dir}/repos/base/run/platform_drv.inc
append_platform_drv_build_components

lappend_if [have_board pc]    build_components drivers/ps2
lappend_if [have_board linux] build_components drivers/framebuffer/sdl
lappend_if [have_board linux] build_components server/nitpicker

build $build_components

create_boot_directory

#
# Generate config
#

append config {
<config>
	<parent-provides>
		<service name="ROM"/>
		<service name="IRQ"/>
		<service name="IO_MEM"/>
		<service name="IO_PORT"/>
		<service name="PD"/>
		<service name="RM"/>
		<service name="CPU"/>
		<service name="LOG"/>
	</parent-provides>
	<default-route/>
	<default caps="100"/>

	<start name="timer">
		<resource name="RAM" quantum="1M"/>
		<provides><service name="Timer"/></provides>
		<route>
			<service name="PD">      <parent/> </service>
			<service name="CPU">     <parent/> </service>
			<service name="LOG">     <parent/> </service>
			<service name="ROM">     <parent/> </service>
			<service name="IO_MEM">  <parent/> </service>
			<service name="IRQ">     <parent/> </service>
			<service name="IO_PORT"> <parent/> </service>
		</route>
	</start>}

append_platform_drv_config

append_if [have_board pc] config {
	<start name="ps2_drv">
		<resource name="RAM" quantum="2M"/>
		<config verbose_keyboard="no" verbose_mouse="no" verbose_scancodes="no"
		        capslock_led="rom" numlock_led="rom" scrlock_led="rom"/>
		<route>
			<service name="ROM" label="capslock"> <child name="dynamic_rom"/> </service>
			<service name="ROM" label="numlock">  <child name="dynamic_rom"/> </service>
			<service name="ROM" label="scrlock">  <child name="dynamic_rom"/> </service>
			<service name="ROM">      <parent/>    </service>
			<service name="CPU">      <parent/>    </service>
			<service name="PD">       <parent/>    </service>
			<service name="IO_PORT">  <parent/>    </service>
			<service name="LOG">      <parent/>    </service>
			<service name="Platform"> <any-child/> </service>
			<service name="Timer">    <child name="timer"/> </service>
			<service name="Event">    <child name="event_dump"/> </service>
		</route>
	</start>}

append_if [have_board linux] config {
	<start name="fb_sdl" ld="no">
		<resource name="RAM" quantum="4M"/>
		<provides> <service name="Input"/> <service name="Framebuffer"/> </provides>
		<route>
			<service name="ROM">     <parent/> </service>
			<service name="CPU">     <parent/> </service>
			<service name="PD">      <parent/> </service>
			<service name="LOG">     <parent/> </service>
			<service name="Timer">   <child name="timer"/> </service>
			<service name="Event">   <child name="event_dump"/> </service>
			<service name="Capture"> <child name="nitpicker"/> </service>
		</route>
	</start>

	<start name="nitpicker">
		<resource name="RAM" quantum="1M"/>
		<provides> <service name="Gui"/> <service name="Capture"/> </provides>
		<route> <any-service> <parent/> <any-child/> </any-service> </route>
		<config> <capture/> </config>
	</start>}

append config {

	<start name="dynamic_rom">
		<resource name="RAM" quantum="4M"/>
		<provides> <service name="ROM"/> </provides>
		<config verbose="no">
			<rom name="capslock">
				<inline> <capslock enabled="no"/> </inline>
				<sleep milliseconds="250" />
				<inline> <capslock enabled="yes"/> </inline>
				<sleep milliseconds="250" />
			</rom>
			<rom name="numlock">
				<inline> <numlock enabled="no"/> </inline>
				<sleep milliseconds="500" />
				<inline> <numlock enabled="yes"/> </inline>
				<sleep milliseconds="500" />
			</rom>
			<rom name="scrlock">
				<inline> <scrlock enabled="no"/> </inline>
				<sleep milliseconds="1000" />
				<inline> <scrlock enabled="yes"/> </inline>
				<sleep milliseconds="1000" />
			</rom>
		</config>
		<route>
			<service name="ROM">   <parent/>             </service>
			<service name="CPU">   <parent/>             </service>
			<service name="PD">    <parent/>             </service>
			<service name="LOG">   <parent/>             </service>
			<service name="Timer"> <child name="timer"/> </service>
		</route>
	</start>

	<start name="event_dump">
		<resource name="RAM" quantum="1M"/>
		<provides> <service name="Event"/> </provides>
		<config/>
		<route>
			<service name="ROM">   <parent/>             </service>
			<service name="CPU">   <parent/>             </service>
			<service name="PD">    <parent/>             </service>
			<service name="LOG">   <parent/>             </service>
			<service name="Timer"> <child name="timer"/> </service>
		</route>
	</start>}

append config {
</config>}

install_config $config

#
# Boot modules
#

# generic modules
set boot_modules { core ld.lib.so init timer dynamic_rom event_dump }

# platform-specific modules
append_platform_drv_boot_modules

lappend_if [have_board pc]    boot_modules ps2_drv
lappend_if [have_board linux] boot_modules fb_sdl
lappend_if [have_board linux] boot_modules nitpicker

build_boot_image $boot_modules

run_genode_until forever
