genode/repos/dde_linux/run/usb_hid_raw.run
Stefan Kalkowski 4775dad26c usb_hid_raw.run: eliminate race in test metric
Rarely. it might happen that events got received shortly before the complete
set of relevant USB devices got recognized. Filter more output in test metric
to stay robust.
2024-04-12 15:08:00 +02:00

253 lines
8.5 KiB
Plaintext

#
# USB HID test
#
# By default, the run script runs interactively and reports any received USB
# input events to the console.
#
# When run with the '--autopilot' run option, the run script tests the USB
# input events generated by a 'Pro Micro' microcontroller.
#
# Pro Micro setup instructions
# ----------------------------
#
# Install prerequisites (example for Xubuntu 16.04):
#
# $ sudo apt-get install gcc-avr avr-libc avrdude
#
# Checkout and build the microcontroller software:
#
# $ git clone https://github.com/cproc/lufa.git
# $ cd lufa
# $ git checkout genode_usb_tests
# $ cd Demos/Device/ClassDriver/KeyboardMouseGenode
# $ make
#
# Connect the 'RST' pin with the 'GND' pin to hold the Pro Micro in the reset
# state.
#
# Connect the Pro Micro to the host PC
#
# Check the device file name with 'dmesg'. If it is not 'ttyACM0', change
# 'AVRDUDE_PORT' in 'makefile' accordingly.
#
# Release the RST/GND pin connection and within the next 8 seconds run:
#
# $ make avrdude
#
# Disconnect the Pro Micro or put it into reset state again to avoid unexpected
# input events on the host PC.
#
if {[have_board linux]} {
puts "Run script does not support Linux."
exit 0
}
if {[get_cmd_switch --autopilot] && [have_include "power_on/qemu"]} {
puts "Run script does not support autopilot mode on Qemu"
exit 0
}
if { [get_cmd_switch --autopilot] &&
![have_board pc] &&
![have_board rpi] &&
![have_board imx8q_evk] &&
![have_board imx6q_sabrelite]} {
puts "Run script does not support autopilot mode on this platform"
exit 0
}
create_boot_directory
import_from_depot [depot_user]/src/[base_src] \
[depot_user]/pkg/test_usb_host_drv-[board] \
[depot_user]/src/dynamic_rom \
[depot_user]/src/report_rom \
[depot_user]/src/usb_hid_drv \
[depot_user]/src/init
build { server/event_dump }
install_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>
<any-service> <parent/> <any-child/> </any-service>
</default-route>
<default caps="100"/>
<start name="timer">
<resource name="RAM" quantum="1M"/>
<provides><service name="Timer"/></provides>
</start>
<start name="report_rom">
<resource name="RAM" quantum="1M"/>
<provides> <service name="Report"/> <service name="ROM"/> </provides>
<config>
<default-policy report="usb_drv -> usb_drv -> devices"/>
</config>
<route>
<any-service> <parent/> </any-service>
</route>
</start>
<start name="usb_drv" caps="1500" managing_system="yes">
<binary name="init"/>
<resource name="RAM" quantum="32M"/>
<provides> <service name="Usb"/> </provides>
<route>
<service name="ROM" label="config">
<parent label="drivers.config"/> </service>
<service name="Report"> <child name="report_rom"/> </service>
<service name="Timer"> <child name="timer"/> </service>
<any-service> <parent/> </any-service>
</route>
</start>
<start name="usb_hid_drv" caps="180">
<resource name="RAM" quantum="11M"/>
<config 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" label="report"> <child name="report_rom"/> </service>
<service name="Event"> <child name="event_dump"/> </service>
<service name="Usb"> <child name="usb_drv"/> </service>
<service name="Timer"> <child name="timer"/> </service>
<any-service> <parent/> </any-service>
</route>
</start>
<start name="dynamic_rom">
<resource name="RAM" quantum="4M"/>
<provides> <service name="ROM"/> </provides>
<config verbose="no">
<rom name="numlock">
<inline> <numlock enabled="no"/> </inline>
<sleep milliseconds="500" />
<inline> <numlock enabled="yes"/> </inline>
<sleep milliseconds="500" />
<inline> <numlock enabled="no"/> </inline>
<sleep milliseconds="500" />
<inline> <numlock enabled="no"/> </inline>
<sleep milliseconds="500" />
<inline> <numlock enabled="yes"/> </inline>
<sleep milliseconds="500" />
</rom>
<rom name="capslock">
<inline> <capslock enabled="no"/> </inline>
<sleep milliseconds="500"/>
<inline> <capslock enabled="no"/> </inline>
<sleep milliseconds="500" />
<inline> <capslock enabled="yes"/> </inline>
<sleep milliseconds="500" />
<inline> <capslock enabled="no"/> </inline>
<sleep milliseconds="500" />
<inline> <capslock enabled="yes"/> </inline>
<sleep milliseconds="500" />
</rom>
<rom name="scrlock">
<inline> <scrlock enabled="no"/> </inline>
<sleep milliseconds="500"/>
<inline> <scrlock enabled="no"/> </inline>
<sleep milliseconds="500" />
<inline> <scrlock enabled="no"/> </inline>
<sleep milliseconds="500" />
<inline> <scrlock enabled="yes"/> </inline>
<sleep milliseconds="500" />
<inline> <scrlock enabled="yes"/> </inline>
<sleep milliseconds="500" />
</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/>
</start>
</config>}
#
# Define USB host controller config
#
set fd [open [run_dir]/genode/usb_host_drv.config w]
puts $fd {
<config bios_handoff="no">
<report devices="yes"/>
<policy label_prefix="usb_hid_drv"> <device class="0x3"/> </policy>
</config>}
close $fd
build_boot_image [build_artifacts]
append qemu_args " -device nec-usb-xhci,id=xhci"
append qemu_args " -device usb-kbd,bus=xhci.0"
append qemu_args " -device usb-mouse,bus=xhci.0"
if { [have_include "power_on/qemu"] || ![get_cmd_switch --autopilot] } { run_genode_until forever }
# autopilot test
run_genode_until {\[init -\> event_dump\] Input event #0\t} 60
# remove everything before the first interesting line
regexp {(\[init -\> event_dump\] Input event #0\t.*)} $output all output
run_genode_until {\[init -\> event_dump\] Input event #11.*\n} 40 [output_spawn_id]
# pay only attention to the output of init and its children
grep_output {^\[init }
# filter out KVM switch messages during the nightly test
unify_output {(?n).*0557:2213.*} ""
unify_output {(?n) on usb-usbbus.*$} ""
unify_output {(?n) at usb-usbbus.*\)} ")"
unify_output {(?n)hid-generic.*input:} "hid-generic: input:"
unify_output {(?n)usb-[0-9]-[0-9]: USB disconnect, device number [0-9]} "usb-X-X: USB disconnect, device number X"
unify_output {(?n)input[0-9]} "inputX"
unify_output {(?n) as /devices/.*} ""
unify_output {(?n)^\[init -\> usb_drv.*} ""
unify_output {(?n)^\[init -\> usb_hid_drv\] Connected device: inputX \(ATEN CS1764A V1.1.110\).*} ""
trim_lines
compare_output_to {
[init -> event_dump] Input event #0 PRESS KEY_X 65534 key count: 1
[init -> event_dump] Input event #1 RELEASE KEY_X key count: 0
[init -> event_dump] Input event #2 REL_MOTION -1+1 key count: 0
[init -> event_dump] Input event #3 PRESS BTN_LEFT 65534 key count: 1
[init -> event_dump] Input event #4 RELEASE BTN_LEFT key count: 0
[init -> usb_hid_drv] usb usb-X-X: USB disconnect, device number X
[init -> usb_hid_drv] Disconnected device: inputX
[init -> usb_hid_drv] Disconnected device: inputX
[init -> usb_hid_drv] input: Dean Camera LUFA Mouse and Keyboard Demo
[init -> usb_hid_drv] Connected device: inputX (Dean Camera LUFA Mouse and Keyboard Demo)
[init -> usb_hid_drv] hid-generic: input: USB HID v1.11 Keyboard [Dean Camera LUFA Mouse and Keyboard Demo]
[init -> usb_hid_drv] input: Dean Camera LUFA Mouse and Keyboard Demo
[init -> usb_hid_drv] Connected device: inputX (Dean Camera LUFA Mouse and Keyboard Demo) MOUSE
[init -> usb_hid_drv] hid-generic: input: USB HID v1.11 Mouse [Dean Camera LUFA Mouse and Keyboard Demo]
[init -> event_dump] Input event #5 PRESS KEY_X 65534 key count: 1
[init -> event_dump] Input event #6 RELEASE KEY_X key count: 0
[init -> event_dump] Input event #7 REL_MOTION -1+1 key count: 0
[init -> event_dump] Input event #8 PRESS BTN_LEFT 65534 key count: 1
[init -> event_dump] Input event #9 RELEASE BTN_LEFT key count: 0
}