mirror of
https://github.com/genodelabs/genode.git
synced 2024-12-22 06:57:51 +00:00
7ec08af6d9
Replace the USB session API by one that provides a devices ROM only, which contains information about all USB devices available for this client, as well as methods to acquire and release a single device. The acquisition of an USB device returns the capability to a device session that includes a packet stream buffer to communicate control transfers in between the client and the USB host controller driver. Moreover, additional methods to acquire and release an USB interface can be used. The acquisition of an USB interface returns the capability to an interface session that includes a packet stream buffer to communicate either bulk, interrupt, or isochronous transfers in between the client and the USB host controller driver. This commit implements the API changes in behalf of the Genode C API's USB server and client side. Addtionally, it provides Usb::Device, Usb::Interface, and Usb::Endpoint utilities that can be used by native C++ clients to use the new API and hide the sophisticated packet stream API. The adaptations necessary target the following areas: * lx_emul layer for USB host and client side * Linux USB host controller driver port for PC * Linux USB client ports: usb_hid_drv and usb_net_drv, additionally reduce the Linux tasks used inside these drivers * Native usb_block_drv * black_hole component * Port of libusb, including smartcard and usb_webcam driver depending on it * Port of Qemu XHCI model library, including vbox5 & vbox6 depending on it * Adapt all run-scripts and drivers_interactive recipes to work with the new policy rules of the USB host controller driver Fix genodelabs/genode#5021
286 lines
8.8 KiB
Plaintext
286 lines
8.8 KiB
Plaintext
if {
|
|
![have_spec hw] &&
|
|
![have_spec nova] &&
|
|
![have_spec sel4]
|
|
} {
|
|
puts "Platform is unsupported."
|
|
exit 0
|
|
}
|
|
|
|
set build_components {
|
|
core init timer
|
|
drivers/platform
|
|
drivers/acpi
|
|
server/event_dump
|
|
app/pci_decode
|
|
app/acpica
|
|
}
|
|
|
|
build $build_components
|
|
|
|
create_boot_directory
|
|
|
|
import_from_depot [depot_user]/src/dynamic_rom \
|
|
[depot_user]/src/event_filter \
|
|
[depot_user]/src/pc_usb_host_drv \
|
|
[depot_user]/src/ps2_drv \
|
|
[depot_user]/src/report_rom \
|
|
[depot_user]/src/usb_hid_drv \
|
|
[depot_user]/src/acpi_event
|
|
|
|
set config {
|
|
<config>
|
|
<parent-provides>
|
|
<service name="IRQ"/>
|
|
<service name="ROM"/>
|
|
<service name="LOG"/>
|
|
<service name="RM"/>
|
|
<service name="PD"/>
|
|
<service name="CPU"/>
|
|
<service name="IO_MEM" />
|
|
<service name="IO_PORT" />
|
|
</parent-provides>
|
|
<default-route>
|
|
<any-service> <parent/> <any-child/> </any-service>
|
|
</default-route>
|
|
|
|
<start name="timer" caps="100">
|
|
<resource name="RAM" quantum="2M"/>
|
|
<provides><service name="Timer"/></provides>
|
|
</start>
|
|
|
|
<start name="drivers_reports" caps="100">
|
|
<binary name="report_rom"/>
|
|
<resource name="RAM" quantum="1M"/>
|
|
<provides>
|
|
<service name="Report"/>
|
|
<service name="ROM"/>
|
|
</provides>
|
|
<config verbose="no">
|
|
<policy label="pci_decode -> system" report="acpi_drv -> acpi"/>
|
|
<policy label="platform_drv -> devices" report="pci_decode -> devices"/>
|
|
<policy label="usb_hid_drv -> report" report="usb_drv -> devices"/>
|
|
</config>
|
|
</start>
|
|
|
|
<start name="acpi_drv" caps="350">
|
|
<resource name="RAM" quantum="4M"/>
|
|
<route>
|
|
<service name="Report"> <child name="drivers_reports"/> </service>
|
|
<any-service> <parent/> <any-child/> </any-service>
|
|
</route>
|
|
</start>
|
|
|
|
<start name="pci_decode" caps="350">
|
|
<resource name="RAM" quantum="2M"/>
|
|
<route>
|
|
<service name="ROM" label="system"> <child name="drivers_reports"/> </service>
|
|
<service name="Report"> <child name="drivers_reports"/> </service>
|
|
<any-service> <parent/> <any-child/> </any-service>
|
|
</route>
|
|
</start>
|
|
|
|
<start name="platform_drv" caps="400" managing_system="yes">
|
|
<resource name="RAM" quantum="4M"/>
|
|
<provides>
|
|
<service name="Platform"/>
|
|
</provides>
|
|
<config>
|
|
<policy label_prefix="ps2_drv"> <device name="ps2"/> </policy>
|
|
<policy label_prefix="usb_drv" info="yes"> <pci class="USB"/> </policy>
|
|
<policy label_prefix="acpica"> <device name="acpi"/> </policy>
|
|
</config>
|
|
<route>
|
|
<service name="ROM" label="devices"> <child name="drivers_reports"/> </service>
|
|
<any-service> <parent/> <any-child/> </any-service>
|
|
</route>
|
|
</start>
|
|
|
|
<start name="ps2_drv" caps="100">
|
|
<resource name="RAM" quantum="2M"/>
|
|
<config verbose_keyboard="no" verbose_mouse="no" verbose_scancodes="no"/>
|
|
<route>
|
|
<service name="Platform"> <child name="platform_drv"/> </service>
|
|
<service name="Timer"> <child name="timer"/> </service>
|
|
<service name="Event"> <child name="event_filter" label="ps2"/> </service>
|
|
<any-service> <parent/> </any-service>
|
|
</route>
|
|
</start>
|
|
|
|
<start name="usb_drv" caps="200">
|
|
<binary name="pc_usb_host_drv"/>
|
|
<resource name="RAM" quantum="20M"/>
|
|
<provides> <service name="Usb"/> </provides>
|
|
<config bios_handoff="no">
|
|
<report devices="yes"/>
|
|
<policy label_prefix="usb_hid_drv"><device class="0x3"/></policy>
|
|
</config>
|
|
<route>
|
|
<service name="Report"> <child name="drivers_reports"/> </service>
|
|
<any-service><parent/><any-child/></any-service>
|
|
</route>
|
|
</start>
|
|
|
|
<start name="usb_hid_drv" caps="140">
|
|
<resource name="RAM" quantum="10M"/>
|
|
<route>
|
|
<service name="ROM" label="report"> <child name="drivers_reports"/> </service>
|
|
<service name="Event"> <child name="event_filter" label="usb"/> </service>
|
|
<service name="Usb"> <child name="usb_drv"/> </service>
|
|
<any-service><parent/><any-child/></any-service>
|
|
</route>
|
|
</start>
|
|
|
|
<start name="event_filter" caps="100">
|
|
<resource name="RAM" quantum="1M" />
|
|
<provides> <service name="Event" /> </provides>
|
|
<config>
|
|
<output>
|
|
<merge>
|
|
<input name="ps2"/>
|
|
<input name="acpi"/>
|
|
<input name="usb"/>
|
|
</merge>
|
|
</output>
|
|
<policy label="ps2" input="ps2"/>
|
|
<policy label="acpi" input="acpi"/>
|
|
<policy label="usb" input="usb"/>
|
|
</config>
|
|
<route>
|
|
<service name="Event"> <child name="event_dump" /> </service>
|
|
<any-service> <parent/> </any-service>
|
|
</route>
|
|
</start>
|
|
|
|
<start name="event_dump" caps="100">
|
|
<resource name="RAM" quantum="1M"/>
|
|
<provides> <service name="Event"/> </provides>
|
|
<route>
|
|
<service name="Timer"> <child name="timer"/> </service>
|
|
<any-service> <parent/> </any-service>
|
|
</route>
|
|
</start>
|
|
|
|
<start name="acpica" caps="400">
|
|
<resource name="RAM" quantum="8M"/>
|
|
<config ld_verbose="yes" reset="yes" poweroff="yes" report="yes"
|
|
report_period_ms="0" verbose="yes">
|
|
</config>
|
|
<route>
|
|
<service name="ROM" label="system"> <child name="dynamic_rom"/> </service>
|
|
<service name="Report"> <child name="acpi_state"/> </service>
|
|
<any-service> <parent/> <any-child/> </any-service>
|
|
</route>
|
|
</start>
|
|
|
|
<start name="acpi_state" caps="100">
|
|
<binary name="report_rom"/>
|
|
<resource name="RAM" quantum="2M"/>
|
|
<provides>
|
|
<service name="ROM" />
|
|
<service name="Report" />
|
|
</provides>
|
|
<config verbose="yes">
|
|
<policy label="acpi_event -> acpi_ac" report="acpica -> acpi_ac"/>
|
|
<policy label="acpi_event -> acpi_battery" report="acpica -> acpi_battery"/>
|
|
<policy label="acpi_event -> acpi_ec" report="acpica -> acpi_ec"/>
|
|
<policy label="acpi_event -> acpi_fixed" report="acpica -> acpi_fixed"/>
|
|
<policy label="acpi_event -> acpi_lid" report="acpica -> acpi_lid"/>
|
|
<policy label="acpi_event -> acpi_hid" report="acpica -> acpi_hid"/>
|
|
</config>
|
|
<route>
|
|
<any-service> <parent/> </any-service>
|
|
</route>
|
|
</start>
|
|
|
|
<start name="acpi_event" caps="100">
|
|
<resource name="RAM" quantum="1M"/>
|
|
<config>
|
|
<!-- example mapping - adapt to your target notebook !!! -->
|
|
<!-- as="PRESS_RELEASE" is default if nothing specified -->
|
|
<map acpi="ec" value="25" to_key="KEY_VENDOR"/>
|
|
<map acpi="ec" value="20" to_key="KEY_BRIGHTNESSUP"/>
|
|
<map acpi="ec" value="21" to_key="KEY_BRIGHTNESSDOWN"/>
|
|
<map acpi="fixed" value="0" to_key="KEY_POWER" as="PRESS_RELEASE"/>
|
|
<map acpi="lid" value="CLOSED" to_key="KEY_SLEEP" as="PRESS_RELEASE"/>
|
|
<map acpi="lid" value="OPEN" to_key="KEY_SLEEP" as="PRESS_RELEASE"/>
|
|
<map acpi="ac" value="ONLINE" to_key="KEY_WAKEUP"/>
|
|
<map acpi="ac" value="OFFLINE" to_key="KEY_SLEEP"/>
|
|
<map acpi="battery" value="0" to_key="KEY_BATTERY"/>
|
|
<map acpi="hid" value="0x4000000" to_key="KEY_FN_F4"/>
|
|
</config>
|
|
<route>
|
|
<service name="ROM" label="acpi_ac"> <child name="acpi_state"/> </service>
|
|
<service name="ROM" label="acpi_battery"> <child name="acpi_state"/> </service>
|
|
<service name="ROM" label="acpi_ec"> <child name="acpi_state"/> </service>
|
|
<service name="ROM" label="acpi_fixed"> <child name="acpi_state"/> </service>
|
|
<service name="ROM" label="acpi_lid"> <child name="acpi_state"/> </service>
|
|
<service name="ROM" label="acpi_hid"> <child name="acpi_state"/> </service>
|
|
<service name="Event"> <child name="event_filter" label="acpi"/> </service>
|
|
<any-service> <parent/> </any-service>
|
|
</route>
|
|
</start>
|
|
|
|
<start name="dynamic_rom" caps="100">
|
|
<resource name="RAM" quantum="4M"/>
|
|
<provides><service name="ROM"/></provides>
|
|
<config verbose="yes">
|
|
<rom name="system">
|
|
<inline description="set system state to 'normal'">
|
|
<system state="normal"/>
|
|
</inline>
|
|
<sleep milliseconds="5000" />
|
|
<!--
|
|
<inline description="set system state to 'reset'">
|
|
<system state="reset"/>
|
|
</inline>
|
|
<sleep milliseconds="5000" />
|
|
<inline description="set system state to 'poweroff'">
|
|
<system state="poweroff"/>
|
|
</inline>
|
|
<sleep milliseconds="500" />
|
|
-->
|
|
</rom>
|
|
</config>
|
|
</start>
|
|
|
|
</config>
|
|
}
|
|
|
|
install_config $config
|
|
|
|
# non PCI devices for platform_drv, e.g. ps2/pit
|
|
file copy [select_from_repositories board/[board]/devices] [run_dir]/genode/devices
|
|
|
|
build_boot_image [build_artifacts]
|
|
|
|
append qemu_args "-nographic "
|
|
|
|
if {![have_include "power_on/qemu"]} {
|
|
run_genode_until forever
|
|
exit 0
|
|
}
|
|
|
|
run_genode_until {\[init -\> acpi_state.*\n} 30
|
|
|
|
set spawn_id $qemu_spawn_id
|
|
|
|
sleep 1
|
|
|
|
# send Ctrl-a+c to enter Qemu's monitor mode
|
|
send "\x01\x63"
|
|
|
|
# wait for monitor to become ready
|
|
run_genode_until {(qemu)} 20 $spawn_id
|
|
|
|
|
|
for {set i 0} {$i < 3} {incr i} {
|
|
|
|
sleep 1
|
|
send "system_powerdown\n"
|
|
run_genode_until {.*key count: 0.*} 3 $spawn_id
|
|
}
|
|
|
|
puts "\nTest succeeded\n"
|
|
exit 0
|