# # 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_spec linux] || [have_spec muen] } { puts "Run script does not support Linux and Muen." 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_spec x86_64] } { puts "Run script does not support autopilot mode on this platform" exit 0 } # # Build # set build_components { core init drivers/timer drivers/usb test/input server/dynamic_rom } lappend_if [have_spec gpio] build_components drivers/gpio source ${genode_dir}/repos/base/run/platform_drv.inc append_platform_drv_build_components build $build_components proc gpio_drv { } { if {[have_spec rpi] && [have_spec hw]} { return hw_gpio_drv } if {[have_spec rpi] && [have_spec foc]} { return foc_gpio_drv } return gpio_drv } create_boot_directory # # Generate config # append config { } append_if [have_spec gpio] config " " append_platform_drv_config append config { } install_config $config # # Boot modules # # generic modules set boot_modules { core ld.lib.so init timer usb_drv test-input dynamic_rom } lappend_if [have_spec gpio] boot_modules [gpio_drv] append_platform_drv_boot_modules build_boot_image $boot_modules append qemu_args " -usb -usbdevice mouse -usbdevice keyboard" append qemu_args " -device usb-ehci,id=ehci" append xen_args { usbdevice=\["mouse","keyboard"\] } if { [have_include "power_on/qemu"] || ![get_cmd_switch --autopilot] } { run_genode_until forever } # autopilot test run_genode_until {\[init -\> test-input\] Input event #1\t} 60 # remove everything before the first interesting line regexp {(\[init -\> test-input\] Input event #1\t.*)} $output all output run_genode_until {\[init -\> test-input\] Input event #12.*\n} 40 [output_spawn_id] unify_output { number [0-9]+} "" unify_output {(?n)on usb-dummy.*$} "" unify_output {(?n)using .*$} "" unify_output {(?n)^.*__wait_event.*$} "" unify_output {(?n)^.*Failed to submit URB.*$} "" unify_output {(?n)^.*dev_warn.*$} "" filter_out_color_escape_sequences trim_lines compare_output_to { [init -> test-input] Input event #1 type=PRESS code=45 rx=0 ry=0 ax=0 ay=0 key_cnt=1 KEY_X [init -> test-input] Input event #2 type=RELEASE code=45 rx=0 ry=0 ax=0 ay=0 key_cnt=0 KEY_X [init -> test-input] Input event #3 type=PRESS code=272 rx=0 ry=0 ax=0 ay=0 key_cnt=1 BTN_LEFT [init -> test-input] Input event #4 type=MOTION code=0 rx=-1 ry=0 ax=0 ay=0 key_cnt=1 [init -> test-input] Input event #5 type=MOTION code=0 rx=0 ry=1 ax=0 ay=0 key_cnt=1 [init -> test-input] Input event #6 type=RELEASE code=272 rx=0 ry=0 ax=0 ay=0 key_cnt=0 BTN_LEFT [init -> usb_drv] dev_info: USB disconnect, device [init -> usb_drv] dev_info: new full-speed USB device [init -> usb_drv] dev_info: D L [init -> usb_drv] dev_info: input: USB HID v1.11 Keyboard [D L] [init -> usb_drv] dev_info: D L [init -> usb_drv] dev_info: input: USB HID v1.11 Mouse [D L] [init -> test-input] Input event #7 type=PRESS code=45 rx=0 ry=0 ax=0 ay=0 key_cnt=1 KEY_X [init -> test-input] Input event #8 type=RELEASE code=45 rx=0 ry=0 ax=0 ay=0 key_cnt=0 KEY_X [init -> test-input] Input event #9 type=PRESS code=272 rx=0 ry=0 ax=0 ay=0 key_cnt=1 BTN_LEFT [init -> test-input] Input event #10 type=MOTION code=0 rx=-1 ry=0 ax=0 ay=0 key_cnt=1 [init -> test-input] Input event #11 type=MOTION code=0 rx=0 ry=1 ax=0 ay=0 key_cnt=1 [init -> test-input] Input event #12 type=RELEASE code=272 rx=0 ry=0 ax=0 ay=0 key_cnt=0 BTN_LEFT }